×

const readonly c 函数

const readonly(c# 在函数声明是能用const或者readonly吗)

admin admin 发表于2023-05-15 09:33:07 浏览84 评论0

抢沙发发表评论

本文目录

c# 在函数声明是能用const或者readonly吗

办法就是你把const与readonly删除掉。
const是常量,是定义一个变量以后就在也不允许改变的,
readonly是定义以后赋给他值以后再也不能改变的。
而你在方法的参数上定义,这是明显的错误,方法的参数是可变的,有你传入的而定的,你仔细想想,这么写完全不符合逻辑。

c# 中 常量和readonly的区别

const是常量,他是在编译时确定的值,编译后再IL语言中会用具体的值来替代这个常量名,readonly可以成为运行时常量,在编译时IL语言中不会用具体的值来替代变量名。
这样在修改const的值时必须重新编译整个工程才可以达到改变常量值的效果,而readonly则不用,所以建议用readonly替代const。

final,static,const在使用上有什么区别

网上找到的,保留了 JAVA中final、staticfinal:final修饰类:该类不可继承 final修饰方法:该方法不能被子类覆盖(但它不能修饰构造函数) final修饰字段属性:属性值第一次初始化后不能被修改 使用final可以提高程序执行的效率,将一个方法设成final后编译器就可以把对那个方法的所有调用都置入嵌入调用里。 static:static修饰成员函数则该函数不能使用this对象 static不能修饰构造函数、函数参数、局部成员变量 static修饰成员字段则当类被虚拟机加载时按照声明先后顺序对static成员字段进行初始化。 static修饰语句块:当类被虚拟机加载时按照声明先后顺序初始化static成员字段和static语句块 static所修饰的方法和字段只属于类,所有对象共享,java不能直接定义全局变量,是通过static来实现的。 java中没有const,不能直接定义常量,是通过static final组合来实现的。 C#中readonly、const readonly、const是c#中的两种常量 readonly:为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,也称为只读变量。 const:为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。

c#中const与readonly区别

readonly 关键字与 const 关键字不同。 const 字段只能在该字段的声明中初始化。 readonly 字段可以在声明或构造函数中初始化。 因此,根据所使用的构造函数,readonly 字段可能具有不同的值。 另外,const 字段为编译时常数,而 readonly 字段可用于运行时常数

C#中readonly常量为什么不能定义在方法中

因为 readonly定义出来的是“常量”而非变量!常量当然只能在方法外。
另外,看你们讨论到const和readonly,我也补充一点:
const和readonly都是定义常量,但是const定义的是静态常量,而readonly定义的是动态常量。
1、const生命的常量是在编译时就会被解析的,而readonly声明的常量是在运行时才被解析;
2、还有,readonly声明的常量的初始化可以延迟到构造函数中,而const不行。

const与readonly的异同

const 的概念就是一个包含不能修改的值的变量。
常数表达式是在编译时可被完全计算的表达式。因此不能从一个变量中提取的值来初始化常量。
如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的。
readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。
因为 readonly 是在计算时执行的,当然它可以用某些变量初始化。
readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。
readonly 关键字与 const 关键字不同。
1. const 字段只能在该字段的声明中初始化。
readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。
2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。
3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
4.const 对于引用类型的常数,可能的值只能是 string 和 null。
readonly可以是任何类型
* 需要注意的一个问题是:
对于一个 readonly 的 Reference 类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。
public static readonly Class1 my = new Class1();

my.SomeProperty = 10; //正常
my = new Class1(); //出错,该对象是只读的
但是,如果上例中的 Class1 不是一个 Class 而是一个 struct,那么后面的两个语句就都会出错。
static readonly:
Java 中 static 是当载入一个类时执行一次的。
C#中是怎么执行的,我没有查到。很奇怪几乎每本java的书都会说static的问题,C#的往往只说怎么用,但是应该是在main函数调用之前初始化,所以static readonly也是运行时的,可以用变量付值,如:
private static readonly string path = System.Windows.Forms.Application.StartupPath + “aaa”;

C#中const 和 static 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 A = B * 20;
static readonly B = 10;
4. static readonly int constIntArray = new int {1, 2, 3};
5. void SomeFunction()
{
const int a = 10;
...
}
1:不可以换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
2:可以换成const。我们也看到,Reference类型的常量(除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。
4:不可以换成const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。
因此,对于那些本质上应该是常量,但是却无法使用const来声明的地方,可以使用static readonly。例如C#规范中给出的例子:
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b)
{
red = r;
green = g;
blue = b;
}
}
static readonly需要注意的一个问题是,对于一个static readonly的Reference类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的。
public static readonly MyClass myins = new MyClass();

myins.SomeProperty = 10; //正常
myins = new MyClass(); //出错,该对象是只读的
但是,如果上例中的MyClass不是一个class而是一个struct,那么后面的两个语句就都会出错。

请描述const关键字同static 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 A = B * 20;
static readonly B = 10;
4. static readonly int constIntArray = new int {1, 2, 3};
5. void SomeFunction()
{
const int a = 10;
...
}
1:不可以换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
2:可以换成const。我们也看到,Reference类型的常量(除了String)只能是Null。
3:可以换成const。我们可以在编译期间很明确的说,A等于200。
4:不可以换成const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等
其他类成员。
因此,对于那些本质上应该是常量,但是却无法使用const来声明的地方,可以使用static readonly。例
如C#规范中给出的例子:
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);static readonly需要注意的一个问
题是,对于一个static readonly的Reference类型,只是被限定不能进行赋值(写)操作而已。而对其成
员的读写仍然是不受限制的。
public static readonly MyClass myins = new MyClass();

myins.SomeProperty = 10; //正常
myins = new MyClass(); //出错,该对象是只读的
但是,如果上例中的MyClass不是一个class而是一个struct,那么后面的两个语句就都会出错。
private byte red, green, blue;
public Color(byte r, byte g, byte b)
{
red = r;
green = g;
blue = b;
}
}
在通俗一点说,const类型赋值必须是脱离系统运行时才能初始化的值(const page p=null正确,const page p= new Page()错误,因为 new Page()需要运行时才初始化)可以使用static readonly(static readonly page p= new Page())

c#中的const何readonly关键字含义和作用有什么区别

const 一个包含不能修改的值的变量。
readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。
常数表达式是在编译时可被完全计算的表达式。因此不能从一个变量中提取的值来初始化常量。
如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的。
readonly 是在计算时执行的,当然它可以用某些变量初始化。
readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。
readonly 关键字与 const 关键字不同。
1. const 字段只能在该字段的声明中初始化。
readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。
2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。
3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
4.const 对于引用类型的常数,可能的值只能是 string 和 null。
readonly可以是任何类型
总结
const只能在初期就使用常量初始化好。对于每一次编译后的结果,const的值是固定的,而readonly的值是可以在运行的时候才确定值的~~

C#中用const修饰的变量和用static readonly修饰的变量有什么区别

看下面的应该能解决你的问题。记得要好评哦。。。C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。 工作原理 readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。 const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。 下面声明两个常量: public static readonly int A = 2; //A为运行时常量 public const int B = 3; //B为编译时常量 下面的表达式: int C = A + B; 经过编译后与下面的形式等价: int C = A + 3; 可以看到,其中的const常量B被替换成字面量3,而readonly常量A则保持引用方式。 声明及初始化 readonly常量只能声明为类字段,支持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进行初始化,初始化完成后便无法更改。 const常量除了可以声明为类字段之外,还可以声明为方法中的局部常量,默认为静态类型(无需用static修饰,否则将导致编译错误),但必须在声明的同时完成初始化。 数据类型支持 由于const常量在编译时将被替换为字面量,使得其取值类型受到了一定限制。const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。下面的代码无法通过编译: public const DateTime D = DateTime.MinValue; 改成readonly就可以正常编译: public readonly DateTime D = DateTime.MinValue; 可维护性 readonly以引用方式进行工作,某个常量更新后,所有引用该常量的地方均能得到更新后的值。 const的情况要稍稍复杂些,特别是跨程序集调用: public class Class1 { public static readonly int A = 2; //A为运行时常量 public const int B = 3; //B为编译时常量 } public class Class2 { public static int C = Class1.A + Class1.B; //变量C的值为A、B之和 } Console.WriteLine(Class2.C); //输出“5“ 假设Class1与Class2位于两个不同的程序集,现在更改Class1中的常量值: public class Class1 { public static readonly int A = 4; //A为运行时常量 public const int B = 5; //B为编译时常量 } 编译Class1并部署(注意:这时并没有重新编译Class2),再次查看变量C的值: Console.WriteLine(Class2.C); //输出“7“ 结果可能有点出乎意料,让我们来仔细观察变量C的赋值表达式: public static int C = Class1.A + Class1.B; 编译后与下面的形式等价: public static int C = Class1.A + 3; 因此不管常量B的值如何变,对最终结果都不会产生影响。虽说重新编译Class2即可解决这个问题,但至少让我们看到了const可能带来的维护问题。 性能比较 const直接以字面量形式参与运算,性能要略高于readonly,但对于一般应用而言,这种性能上的差别可以说是微乎其微。 适用场景 在下面两种情况下: a.取值永久不变(比如圆周率、一天包含的小时数、地球的半径等) b.对程序性能要求非常苛刻 可以使用const常量,除此之外的其他情况都应该优先采用readonly常量。 问题:1. 私有静态成员的作用(private static 变量)字面表示私有的,类外不能使用;静态的,全局变量。看上去很矛盾,又不能被类外使用,要全局的有什么用。问得好,类中全局也是很有意义的,例如 private static int a = 5,那么就可以保证变量a在类的初始化过程中将被优先初始化(在构造函数执行之前)。这样如果对象A的初始化需要对象B的实例,那么就可以用这种申明,以保证在类A在构造函数中能够使用类B的实例。同时private又能够保证类B的实例只能在类A中使用,起到很好的密封作用。2. 私有最终成员作用(private final 变量)在类构造函数完成前必须对该成员完成初始化,一旦定义不许更改;该成员只能在本类中使用。实例,子类中都不能使用。private static final修饰的成员在申明的时就被赋值,保证在构造函数中可以被使用,一个被private static final修饰的成员通常表示其他组件的一个实例,且变量是类中的全局变量。private final 修饰的成员在构造中被赋值,表示它是该类全局的私有成员变量,且该类的构造需要传入他们的初始值,才能完成类的初始化。
C# const和static readonly区别const: 用const修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序
static readonly: 用static readonly修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化。C# const和static readonly区别示例:using System; using System.Collections.Generic; using System.Text; namespace Example02Lib { public class Class1 { public const String strConst = “Const“; public static readonly String strStaticReadonly = “StaticReadonly“; //public const String strConst = “Const Changed“; //public static readonly String strStaticReadonly = “StaticReadonly Changed“; } } 客户端代码:using System; using System.Collections.Generic; using System.Text; using Example02Lib; namespace Example02 { class Program { static void Main(string args) { //修改Example02中Class1的strConst初始值后,只编译Example02Lib项目 //然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录,执行Example02.exe //切不可在IDE里直接调试运行因为这会重新编译整个解决方案!! //可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变 //表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的 Console.WriteLine(“strConst : {0}“, Class1.strConst); Console.WriteLine(“strStaticReadonly : {0}“, Class1.strStaticReadonly); Console.ReadLine(); } } } 修改后的示例:using System; using System.Collections.Generic; using System.Text; namespace Example02Lib { public class Class1 { //public const String strConst = “Const“; //public static readonly String strStaticReadonly = “StaticReadonly“; public const String strConst = “Const Changed“; public static readonly String strStaticReadonly = “StaticReadonly Changed“; } }