Tag: const

为什么我不能将常量字符串的串联分配给常量字符串?

有时我想分解一个常量字符串,原因是格式化,通常是SQL。 const string SELECT_SQL = “SELECT Field1, Field2, Field3 FROM TABLE1 WHERE Field4 = ?”; 至 const string SELECT_SQL = “SELECT Field1, Field2, Field3 ” + “FROM TABLE1 ” + “WHERE Field4 = ?”; 但是,C#编译器不允许第二种forms为常量字符串。 为什么?

优秀的价值观优雅解决方案

我正在开发一个WPF应用程序,其窗口大小和组件位置必须在初始化时动态计算,因为它们基于我使用的主UserControl大小和一些其他小尺寸设置。 所以,目前,我已将这些常量值放在我的Window代码中,如下所示: public const Double MarginInner = 6D; public const Double MarginOuter = 10D; public const Double StrokeThickness = 3D; public static readonly Double TableHeight = (StrokeThickness * 2D) + (MarginInner * 3D) + (MyUC.RealHeight * 2.5D); public static readonly Double TableLeft = (MarginOuter * 3D) + MyUC.RealHeight + MarginInner; public static readonly Double TableTop […]

其中t:类generics约束和const值声明

根据10.4 Constants C#规范: 常量声明中指定的类型必须是 sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool,string,enum-type 或reference-type。 每个常量表达式必须生成目标类型或可通过隐式转换(第6.1节)转换为目标类型的类型的值。 为什么我不能做以下事情: public class GenericClass where T : class { public const T val = null; } 这应该是可能的,因为: where T : class表示, The type argument must be a reference type; this applies also to any class, interface, delegate, or array type The type argument must be a reference type; […]

重新编译引用的程序集时不变的常量值

我在汇编中有这个代码: public class Class1 { public const int x = 10; } 在我有一个不同的集会: class Program { static void Main(string[] args) { Console.WriteLine(Class1.x); Console.ReadKey(); } } 当然输出是10 ,但后来我把x改为20 : public class Class1 { public const int x = 20; } 我重新编译了程序集并将其移动到我的命令行程序的bin目录中。 但是,我的程序输出仍然是10 ,直到我编译包含main函数的程序集。 为什么会这样?

声明一个长的常量字节数组

我有一个长字节数组,我需要在我的C#代码中声明。 我做这样的事情: public static class Definitions { public const byte[] gLongByteArray = new byte[] { 1, 2, 3, //and so on }; } 但我得到一个错误,const数组可能只用空值初始化。 如果我将const更改为static它会编译,但我的问题是 – 当我将其声明为public static byte[] gLongByteArray ,每次我的应用程序加载时都不会初始化它,对吧? 在这种情况下, gLongByteArray变量将简单地指向在已加载到内存中的已编译exe / dll文件中定义的数组。 我问的原因是因为这个数组很长,我不希望我的程序在每次应用程序启动时浪费CPU周期加载它,或者更糟糕的是,这个类被引用…

如何将枚举数作为常量?

根据枚举中定义的项目总数 ,我看到我可以使用以下命令获取枚举数: Enum.GetNames(typeof(Item.Type)).Length; 效果很好! 但是,我需要将此数字作为常数,以便我可以在Unity的[Range(int, int)]function中使用它。 private const int constEnumCount = Enum.GetNames(typeof(Item.Type)).Length; 以上不起作用,因为枚举计数不是常数,所以我不能将它分配给常量变量。 如何将枚举数作为常量?

具有丰富类型的C#中的const正确性

来自C ++背景并尝试学习C#,我遇到的最令人沮丧的语言遗漏之一是与const关键字等效。 所以,我一直试图找到一种模式,我可以用它来实现C#中的const正确性。 这个答案有一个有趣的建议:为你的所有类型创建一个只读界面。 但正如Matt Cruikshank在评论中指出的那样,如果你的class级有collections品或其他丰富的类型,这就成了问题。 特别是如果您无法控制类型,并且无法使其实现只读接口。 是否存在可以处理丰富类型和集合的任何模式或解决方案,或者我们是否强制在C#中进行复制? 在C#中完全放弃const正确性是否更好?

在.NET中,为什么常量在编译时而不是在JIT时进行评估?

今天,当我在静态类中更改公开可见常量的值,然后用新编译的版本替换了程序集的旧副本时,我有点意外。 令人惊讶的是,引用程序集的现有程序没有获取常量的新值。 也就是说,我没有重新编译可执行文件,而只是替换了那个程序集。 我的实验的完整描述是如何常数是常数? 我承认对这种行为感到非常惊讶。 我明白发生了什么,但我不明白为什么 。 是否有一个特殊的技术原因导致常量不能在JIT时间而不是编译时间被选中? 有没有这样做会破坏事情的情况?

为什么不能将nullebles声明为const?

[TestClass] public class MsProjectIntegration { const int? projectID = null; // The type ‘int?’ cannot be declared const // … } 为什么我不能拥有const int? ? 编辑:我想要一个可空的int作为const的原因是因为我只是用它来从数据库加载一些示例数据。 如果它为null我只是在运行时初始化样本数据。 这是一个非常快速的测试项目,显然我可以使用0或-1但是int? 感觉就像我想做的那样正确的数据结构。 readonly似乎是要走的路

C#“常量对象”用作默认参数

有没有办法创建一个常量对象(即它无法编辑并在编译时创建)? 我只是在玩C#语言并注意到可选参数function,并认为可以将默认对象用作可选参数。 考虑以下: //this class has default settings private const SettingsClass DefaultSettings = new SettingsClass (); public void doSomething(SettingsClass settings = DefaultSettings) { } 这显然不能编译,但是我想做的一个例子。 是否可以创建这样的常量对象并将其用作可选参数的默认值?