大家好我很困惑我是const long size =((long)int.Maxvalue+1)/4如何插入的...当我们定义static const long size =((long)int.Maxvalue+1)/4什么是readonly会员时会发生什么......
我工作在一个数学库,并且由于与工作的内在困境double我编码人人平等的比较型a == b的Math.Abs(a - b) <= epsilon.
此外,默认情况下,我希望以最大考虑精度生成格式化的字符串.也就是说,如果epsilon是0.001我想要的默认格式N3.
我很高兴我做了以下事情:
public static class Math3D
{
internal const int ROUND = 3;
public const double Epsilon = 1e-ROUND;
}
Run Code Online (Sandbox Code Playgroud)
......我收到了编译错误.显然这是不允许的.
有了这个限制,我认为我无法将两个相互依赖的常量定义为consts.显然我可以定义Epsilon为只读字段,但我觉得这样做在概念上是错误的.我错过了一个如何做到这一点的明显方法吗?
我怎样才能做到这一点:
private const string myConstant = ConfigurationManager.AppSettings["key"];
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:分配给“XXX”的表达式必须是常量。
我知道这个 AppSettings 可能永远不会改变,但我不想在我的控制器中硬编码值,如下所示:
private const string myConstant = "XXX";
Run Code Online (Sandbox Code Playgroud)
我想创建一个单身人士,但我不知道这是否真的是个好主意..有什么建议吗?
谢谢 :)
为什么const在编译时它们的值被替换为值,但是仍然包含在汇编中?至少这是IL DASM和Reflector所展示的.
目前我const用于定义许多幻数和字符串,以便更容易地更改代码而不影响运行时性能.
现在我知道这不会影响已用内存,但它仍会影响编译的程序集大小,这对于手机应用程序来说至关重要.
另一个缺点是,在查看反汇编代码时,其他人更容易理解幻数.
我真的很感兴趣为什么编译器(Mono和.NET)完全这样做?
在C++中,如果我想在编译时初始化一个对象并且之后永远不会改变,我只需添加前缀const.
在C#中,我写道
// file extensions of interest
private const List<string> _ExtensionsOfInterest = new List<string>()
{
".doc", ".docx", ".pdf", ".png", ".jpg"
};
Run Code Online (Sandbox Code Playgroud)
并得到错误
除string之外的引用类型的const字段只能用null初始化
然后我研究了Stack Overflow上的错误,并提出了"解决方案" ReadOnlyCollection<T>.除字符串之外的引用类型的const字段只能使用null Error初始化
但这并没有真正给我我想要的行为,因为
// file extensions of interest
private static ReadOnlyCollection<string> _ExtensionsOfInterest = new ReadOnlyCollection<string>()
{
".doc", ".docx", ".pdf", ".png", ".jpg"
};
Run Code Online (Sandbox Code Playgroud)
仍然可以重新分配.
那么我该怎样做我想做的事情呢?
(令人惊讶的是,除了我想要的语言之外,C#还具有所有语言功能的可模仿性.
假设我有一些相互依赖的常量,我决定将它们放在一个容器中,而不是将它作为一个单独的常量保存在一个容器中.
我认为使用a Structure作为该范围,但编译器强制我声明该结构的私有成员.
' Compile error: at least one private member is needed.
Private Structure BandSizes
Const BandHeight As Short = HourHeight + 20
Const HourHeight As Short = HalfHourHeight + 20
Const HalfHourHeight As Short = LineHeight + PictureHeight + 20
Const PictureHeight As Short = 20
Const LineHeight As Short = StopHeight + 10
Const LineWidth As Short = 50
Const StopHeight As Short = 30
End Structure
Run Code Online (Sandbox Code Playgroud)
因为我只有几个整数常量,我应该创建一个共享(静态)类吗?
平台:VB.NET(.NET 2)
我有一个带有全局变量的Windows窗体应用程序 - 一个名为的字符串testPath.
此字符串用于保存路径 - 默认情况下C:\temp\.当用户单击按钮时,将创建此目录(如果它尚不存在).
如果用户想要更改路径的值,还有一个文本框控件.
在按钮的事件处理程序中,我尝试访问testPath并获得空引用.
我没有改变testPath任何地方的值,除非我将它传递给文本框Control和从文本框Control传递.
我究竟做错了什么?全局变量如何在一秒内有内容,然后在之后它指向空引用?
这是完整的代码:
public string testPath = @"C:\temp\";
public MainForm()
{
//Windows Designer call
InitializeComponent();
//Show the testPath in the textBox (using Invokes)
this.textBox1.Invoke(new MethodInvoker(delegate { this.textBox1.Text = testPath; } ));
//here, testPath contains 'C:\temp\'
}
//Button "Click" handler
private void Button1Click(object sender, EventArgs e)
{
//here, testPath contains a null reference!
//If the user changed testPath in the textBox, we need to save …Run Code Online (Sandbox Code Playgroud) 尝试整理范围并避免可能多次调用RegisterWindowMessage.
目前有一个类使用以下成员一次
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int RegisterWindowMessage(string lpString);
private int m_message = RegisterWindowMessage("MY_MSG");
Run Code Online (Sandbox Code Playgroud)
由于我们只有一个实例,这似乎没问题,但认为使用它会更整洁.根据我的基本C#理解,这应该调用RegisterWindowMessage并将结果分配给int并且不允许它更改.
private const int message = RegisterWindowMessage("MY_MSG");
Run Code Online (Sandbox Code Playgroud)
但试图这样做会导致a
error CS0133: The expression being assigned to 'someclass.messageEvent' must be constant
Run Code Online (Sandbox Code Playgroud)
所以现在我很困惑,这是否意味着函数被分配并且每次调用之前都m_message被调用过,是否还有其他缺失?
public class Foo
{
private readonly Bar _bar;
}
public class Foo2
{
private Bar _bar;
}
Run Code Online (Sandbox Code Playgroud)
我认为将其标记为只读是没有任何好处的.这是私人的,如果我尝试在内部做一些修改它,那我是愚蠢的,因为我知道我希望我的班级表现如何?那么,有什么意义呢?我不认为这里有任何性能提升,所以不可能.