const和readonly区别

合集下载

刚毕业1年2年3年工作经验都可用的C#面试题及答案(设计模式在后面)

刚毕业1年2年3年工作经验都可用的C#面试题及答案(设计模式在后面)

C#面试题(设计模式在后面)2。

const和readonly有什么区别?答:const可以用于类的成员常量和局部常量,必须在声明时赋值,之后不可以对常量进行赋值。

而readonly只能用于类的成员变量不能用于局部变量,在声明时可以不赋值,除了在构造函数中可以再次赋值外,其它的地方和const一样也不能赋值.5。

接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?答答:区别如下(1) 抽象类可以有抽象成员(无具体实现),也可以有非抽象成员(有具体实现);接口只有抽象成员。

(2)一个类不能同时继承多个抽象类,一个类可以同时实现多个接口.如果多个子类中有很多代码是重复的,这时采用抽象类,因为可以将这些代码放到抽象类的非抽象方法中,这样可以达到代码复用.当实现多个接口时因为抽象类不支持,只能使用接口.6. struct和class有什么区别答:两者都可以有成员变量、属性、索引器、事件、函数、构造函数,主要区别如下:区别点结构类类型值类型引用类型成员变量在声明时不能赋值可以赋值也可以不赋值构造函数可以不写,系统提供默认构造函数,默认构造函数中会将所有成员值设为0,如果写了构造函数则构造函数必须有参数,且在构造函数中必须为每一个成员赋值。

可以不写,系统提供默认构造函数,写了也没有结构中的限制.析构函数不能有析构函数可以有析构函数继承性自定义的结构不能从类继承,但可以实现接口,结构都是密封(sealed),不能从结构继承类没有限制7。

try后面一个finally,try中有一个return,那么finally中的代码会不会运行?如果运行,是在return后还是return前。

答:会运行,并且在return 后运行。

8。

产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

答:该题解题思路有很多,主要是看运行效率如何,下面提供一种方法。

int[] array = new int[100];int temp[] = new int[100];for (int i = 0;i < 100;i++){temp[i]=i+1;}Random rand = new Random();for (int i = 0;i < 100; i++){int index = rand。

c# const与readonly

c# const与readonly

我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。

在多数情况下可以混用。

二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。

而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。

明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了:1. static readonly MyClass myins = new MyClass();2. static readonly MyClass myins = null;3. static readonly B = 10; static readonly A = B * 20;4. static readonly int [] constIntArray = new int[] {1, 2, 3};5. void SomeFunction(){const int a = 10;...}6.private static string astr="abcd";private const string str = astr+"efg";1:不可以换成const。

new操作符是需要执行构造函数的,所以无法在编译期间确定2:可以换成const。

我们也看到,Reference类型的常量(除了String)只能是Null。

3:可以换成const。

我们可以在编译期间很明确的说,A等于200。

4:不可以换成const。

道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。

5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。

6.错误:如果在astr前加上const或者const改为readonly即可;总结:1.const、readonly和static readonly定义的常量,指定初始值后(包括在构造函数内指定的初始值) 将不可更改,可读不可写;2.const定义时必须指定初始值,而readonly定义时可以不进行初始化(MS建议在定义时初始值),同时也可以在构造函数内指定初始值,并以构造函数内指定的值为准;3.const和static readonly定义的常量是静态的,只能由类直接访问;而readonly定义的常量是非静态的,只能由实例对象访问;4.static readonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数;5.const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。

NET高级工程师面试题题目

NET高级工程师面试题题目

net软件工程师面试题根本题:1. 简述string[]、ArrayList、List的区别。

数组:利益:o数组在内存中是接连存储的,索引速度十分快;o赋值和修改元素也很简单;不足:o两个数据之间插入数据对照贫穷困难;o声明数组的时辰,必须指明数组的长度,数组长渡过长会造成内存挥霍,数组的长渡过短,会造成数据溢犯错误。

ArrayList:利益:o. net framework 提供的用于数据存储和检索的专用类o大小依据存储的数据来动态扩展和收缩o继承IList,可以方便的进行数据的添加、插入和删除瑕玷:o许可插入差别类型的数据,都当做object类型处理o数据处理时大概出现类型不匹配的错误o存在装箱(值=》引用)拆箱的操纵,会带来很大的性能损耗List:利益:o声明List集合时,需要声明集合内数据的对象类型o避免了类型安然问题和装箱拆箱的性能问题2. 简述装箱和拆箱操纵中的性能损耗是若何产生的。

3. 简述对ASP. NET中的事务机制的懂得。

4. 在一个ASP. NET的三层结构系统中,以登录操纵为例,简述在各层中若何组织代码。

5. 简述相比DATASET,实体类在WEB项目中的利益与瑕玷。

6. 简述GC是若何工作的。

Java采纳VM(Virtual Machine)机制,由VM来经管程序的运行当然也包罗对GC 经管。

90年代末期. NET出现了, . NET采纳了和Java类似的方式由CLR(Common Language Runtime) 来经管。

Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为根本,遍历应用程序在Heap上动态分配的所有对象[2],通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。

已经不再被应用程序的root 大概别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。

这就是GC工作的原理。

C#定义常量的两种方法

C#定义常量的两种方法

C#定义常量的两种⽅法在C#中定义常量的⽅式有两种,⼀种叫做静态常量(Compile-time constant),另⼀种叫做动态常量(Runtime constant)。

前者⽤“const”来定义,后者⽤“readonly”来定义。

对于静态常量(Compile-time constant),它的书写⽅式如下:public const int MAX_VALUE = 10;为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意:如下书写是错误的,会出编译错误,这⾥只是为了⽅便说明)。

public static const int MAX_VALUE = 10;⽤const定义的常量,对于所有类对象⽽⾔都是⼀样的,因此需要像访问静态成员那样去访问const定义的常量,⽽⽤对象的成员⽅式去访问会出变异错误。

此外,对于静态常量的访问在编译的时候,是⽤常量的值去替换常量,例如:int nValue = MAX_VALUE;这句在编译之后,和如下这句所产⽣的中间语⾔代码是⼀样的。

int nValue = 10;不过,在⽤const来定义常量的时候,在类型上有很多限制。

⾸先,此类型必须属于值类型,同时此类型的初始化不能通过new来完成,因此⼀些⽤struct定义的值类型常量也不能⽤const来定义。

相对于const⽽⾔,⽤readonly来定义常量要灵活的多,它的书写⽅式如下:public readonly int MAX_VALUE = 10;为什么称为动态变量,因为系统要为readonly所定义的常量分配空间,即和类的其他成员⼀样拥有独⽴的空间。

此外,readonly所定义的常量除了在定义的时候可以设定常量值外,还可以在类的构造函数中进⾏设定。

由于readonly所定义的常量相当于类的成员,因此使⽤const来定义常量所受到的类型限制,在使⽤readonly去定义的时候全部消失,即可以⽤readonly去定义任何类型的常量。

C# 的知识点总结

C# 的知识点总结

C#知识点总结1、 Console.WriteLine():打印到控制台并换行2、 C#类型:值类型、引用类型3、 namespace:不同文件夹下的类可以属于同一个namespace4、字符串相加:使用“ + ”操作符,任何其他对象与字符串相加都会自动调用ToString()5、字符串存储:str1 = “111”; str2 = “111”,str1和str2指向同一地址6、字符串比较:只要str1和str2内容相同,str1 == str2表达式都会返回true。

==操作符被String重载7、整型:byte、short、int、long,都有相应的有/无符号版本,其中byte 是无符号的,其他是有符号的8、浮点型:float、double、decimal,只有有符号版本9、值类型中的数值型:都包含MinValue、MaxValue属性,可以直接由类型通过(.)操作符访问10、强制类型转换:“()”操作符,如int i = (int)c;11、 char:字符型,Unicode编码(16位)。

可看作无符号整型,可以使用ushort 以上的类型强制类型转换。

12、 char/Unicode码段常量:数字0-9(48-57),大写字母A-Z(65-90),小写字母a-z(97-122)13、特殊字符:’\t’-制表位;’\n’-换行符eg: Console.WriteLine("ying shi\t yang") 效果为: ying shi yang (中间空四个格)14、赋值语句/表达式:赋值语句在表达式中只计算左值,计算前已经将右值计算结果赋予左值15、 bool:逻辑型,只有两个值,true/false16、出现在字符串中的双引号:写法为(\")17、数值、char、bool的Parse()方法:基础值类型都包含该方法,将字符串转为本类型变量18、数值型.Parse():参数如果不是数值,或者越界,将返回异常19、编译器捕获数值计算越界:在编译期判断是否越界,如果判断越界,则根本不可能编译成功20、未捕获的数值计算越界(如方法调用):则回到数值型范围开始处。

const与readonly

const与readonly

const与readonly 很像,都是将变量声明为只读,且在变量初始化后就不可改写。

那么,const与readonly 这两个修饰符到底区别在什么地方呢?其实,这个牵扯出C#语言中两种不同的常量类型:静态常量(compile-time constants)和动态常量(runtime constants)。

这两者具有不同的特性,错误的使用不仅会损失效率,而且还会造成错误。

首先先解释下什么是静态常量以及什么是动态常量。

静态常量是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。

而动态常量的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。

当你大致了解上面的两个概念的时候,那么就可以来说明const与readonly了。

const修饰的常量是上述中的第一种,即静态常量;而readonly则是第二种,即动态常量。

那么区别可以通过静态常量与动态常量的特性来说明:1)const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化2)const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候此外const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中。

const 的概念就是一个包含不能修改的值的变量。

常数表达式是在编译时可被完全计算的表达式。

因此不能从一个变量中提取的值来初始化常量。

如果const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的。

readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。

因为readonly 是在计算时执行的,当然它可以用某些变量初始化。

readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。

C#高效反射调用方法类

C#高效反射调用方法类
methodInfo.Invoke(program, parameters);
methodInfo实际上已经用到反射了,只不过此时的反射相比较于后边的Invoke方法性能损失很小,可以忽略,影响性能部分在Invoke而不在一次简单的GetMethod,MethodInfo可以缓存,因此只需要取一次就够了,所以完全可以忽略不计。
}
public static FastInvokeHandler GetMethodInvoker(MethodInfo methodInfo)
{
DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, typeof(object), new Type[] { typeof(object), typeof(object[]) }, methodInfo.DeclaringType.Module);
for (int i = 0; i < paramTypes.Length; i++)
{
if (ps[i].ParameterType.IsByRef)
paramTypes[i] = ps[i].ParameterType.GetElementType();
方法二:
使用传统的.net反射机制,调用类的方法时,在调用频率大的情况下,会感觉速度很慢。最近浏览卢彦的博客时,找到一个他改进后的反射调用类。试用以后感觉效率明显提高,特推荐给大家。作者重新实现了,反射调用方法,但是调用接口和.net原有方法一致。而且调用时抛出的异常为所调用类的实际异常,不像传统方式返回为包装异常。
else
paramTypes[i] = ps[i].ParameterType;

你必须知道的Csharp的25个基础概念

你必须知道的Csharp的25个基础概念
//public static readonly String strStaticReadonly = &amp;quot;StaticReadonly Changed&amp;quot;;
}//5-1-a-s-p-x
}
复制代码
客户端代码:
using System;
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Text;
namespace Example02Lib
{
public class Class1
{
public const String strConst = &amp;quot;Const&amp;quot;;
static int Main()
{
string myString;
Console.Write(&amp;quot;Enter your message: &amp;quot;);
myString = Console.ReadLine();
return MessageBox(0, myString, &amp;quot;My Message Box&amp;quot;, 0);
}
}
}
复制代码
结果:
4.abstract是什么意思?答:abstract修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员abstract不可以和static、virtual、override一起使用声明为abstract成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,通常用于强制继承类必须实现某一成员示例:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
顺便看了一下readonly和const的区别:
readonly和const都是用来标识常量的。
const可用于修饰class的field或者一个局部变量(local variable);而readonly仅仅用于修饰class的field。
const常量的值必定在编译时就已明确并且恒定的;而readonly常量却有一点不同,那就是其值可以在运行时编译,当然,它也必须遵守作为常量的约束,那就是值必须恒定不变。
能被const修饰声明为常量的类型必须是以下的基元类型(primitive type):sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, float, bool, decimal, string。
object,数组(Array)和结构(struct)不能被声明为const常量。
Console.WriteLine("InstantReadonlyInt = " + c.InstantReadonlyInt.ToString());
Console.WriteLine("StaticReadonlyInt = " + Constant.StaticReadonlyInt.ToString());
另外,如果要表示对象内部的默认值的话,而这类值通常是常量性质的,那么也可以考虑const。更多时候我们对源代码进行重构时(使用Replace Magic Number with Symbolic Constant),要去除魔数(Magic Number)的影响都会借助于const的这种特性。
对于readonly和const所修饰的变量究竟是属于类级别的还是实例对象级别的问题,我们先看看如下代码:
一般情况下,如果你需要表达一组相关的编译时确定常量,你可以考虑使用枚举类型(enum),而不是把多个const常量直接嵌入到class中作为field,不过这两种方式没有绝对的孰优孰劣之分。
using System;
enum CustomerKind
{
SuperVip,
Vip,
Normal
}
class Customer
static void Main(string[] args)
{
Constant c = new Constant(3);
Console.WriteLine("ConstInt = " + Constant.ConstInt.ToString());
Console.WriteLine("ReadonlyInt = " + c.ReadonlyInt.ToString());
2:可以换成const。我们也看到,Reference类型的常量(除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。
4:不可以换成const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。
并以构造函数内指定的值为准;
3.const和static readonly定义的常量是静态的,只能由类直接访问;而readonly定义的常量是非静态的,只能由实例对象访问;
4.static readonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数;
5.const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。在应用上以static readonly代替const,以平衡const在灵活性上的不足,
我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了:
1. static readonly MyClass myins = new MyClass();
2. static readonly MyClass myins = null;
3. static readonly B = 10; static readonly A = B * 20;
4. static readonly int [] constIntArray = new int[] {1, 2, 3};
Examples:
using System;
public class Order
{
public Order()
{
Guid guid = Guid.NewGuid();
ID = guid.ToString("D");
}
//对于每一份订单,其订单序号都是实时确定的常量。
public readonly string ID;
一般情况下,引用类型是不能被声明为const常量的,不过有一个例外:string。该引用类型const常量的值可以有两种情况,string或null。其实,string虽然是引用类型,但是.NET却对它特别处理,这种处理叫做字符串恒定性(immutable),使得string的值具有只读特性。有关字符串恒定性的内容,可以参考《Microsoft .NET框架程序设计(修订版)》。
}
public const int ConstInt = 0;
public readonly int ReadonlyInt = 1;
public readonly int InstantReadonlyInt;
public static readonly int StaticReadonlyInt = 4;
{
public Customer(string name, int kind)
{
m_Name = name;
m_Kind = kind;
}
public const int NORMAL = 0;
public const int VIP = 1;
public const int SUPER_VIP = 2;
Using directives#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace ConstantLab
{
class Program
{
const常量属于类级别(class level)而不是实例对象级别(instant object level),并且它不能跟static结合一起使用,该常量的值将由整个类的所有实例对象共同分享(详细论述参见后面的Remark区域)。
readonly常量既可以是类级别也可以是实例对象级别的,这取决于它的声明以及初始化工作怎么实施。readonly可以与static结合使用,用于指定该常量属于类级别,并且把初始化工作交由静态构造函数(static constructor)完成(有关如何把readonly常量声明为类级别或实例对象级别的论述清参见后面的Remark区域)。
同时克服编译器优化cosnt性能,所带来的程序集引用不一致问题;
文章2:
readonly和const比较
前天犯了个低级错误,是关于readonly的,总结了一下:
C#的readonly关键字只能在字段上面使用
public readonly TcpClient client;
不能在类,方法,属性上面使用readonly!!
Console.WriteLine("Press any key to continue");
Console.ReadLine();
}
}
class Constant
{
public Constant(int instantReadonlyInt)
{
InstantReadonlyInt = instantReadonlyInt;
自动递增值。你可以通过把DataColumn.AutoIncrement设定为true值来激活自动递增特性。
唯一名称。这个是使用自己定义的算法来生成一个唯一序列号。
GUID(全局唯一标识符)。你可以通过System.Guid结构来生成GUID,如上例。
using System;
class Customer
private string m_Name;
public string Name
{
get { return m_Name; }
}
private readonly int m_Kind;
public int Kind
{
get { return m_Kind; }
}
public override string ToString()
5. void SomeFunction()
{
const int a = 10;
...
}
6.private static string astr="abcd";
private const string str = astr+"efg";
1:不可以换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
}
相关文档
最新文档