我有个问题.最近我发现自己使用了3种不同的代码行,经过仔细检查后看起来和感觉都一样.
public static class constant
{
public static readonly int val1 = 5;
public const int val2 = 5;
public static int val3 { get { return 5; } }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,它们是否相同,是否应该使用另一个?如果是这样.什么时候?
作为视觉工作室中的一个额外问题,为什么它们在intellisense中的表现方式不同?

关于这个问题有很多问题,但没有一个(除了一个,但仍然是一个短的)正在处理以下场景.
来自C#4书:

马克还写道:
如果更改const的值,则需要重建所有客户端
题 :
1)为什么?是static readonly和const- static?
2)实际值保存在哪里?
3)如何使一个领域static readonly实际上solve这个问题"落后于现场"?
在下面的代码中,我正在检查对象引用的相等性.
string x = "Some Text";
string y = "Some Other Text";
string z = "Some Text";
Console.WriteLine(object.ReferenceEquals(x, y)); // False
Console.WriteLine(object.ReferenceEquals(x, z)); // True
Console.WriteLine(object.ReferenceEquals(y, z)); // False
y = "Some Text";
Console.WriteLine(object.ReferenceEquals(x, y)); // True
Console.WriteLine(object.ReferenceEquals(x, z)); // True
Console.WriteLine(object.ReferenceEquals(y, z)); // True
Run Code Online (Sandbox Code Playgroud)
这里:
x并z指同一个对象; 我可以说x是实习并z使用了taht版本.好吧,我不确定这个; 如果我错了,请纠正我.y通过赋予它与x相同的值来改变它的值.我以为它会在这里创建一个新对象; 但我错了,它使用相同的参考.我的问题是:
.net使用字符串实习生?我有一类我有一个字符串字段。此字符串字段是常量,将来会在资源文件中移动,但暂时将保留在我们的类中。现在的情况是,我正在制作该类的数百个对象。所以我的问题是,哪种方法消耗的内存更少,为什么?
我应该让我的字符串变量 static
public class MyClass
{
public static string MyString = "My String";
}
Run Code Online (Sandbox Code Playgroud)我应该让我的字符串变量 const
public class MyClass
{
public const string MyString = "My String";
}
Run Code Online (Sandbox Code Playgroud)这可能是一个愚蠢的问题,但我真的很好奇,如果我能做到这一点.我写了以下示例程序:
class Test1 {
public const int b = 8;
public static int z = 3;
public static void Main(string[] args){
const int q = 6;
Console.WriteLine(q);
Console.WriteLine(b);
Console.WriteLine(z);
}
}
Run Code Online (Sandbox Code Playgroud)
Y编译使用mcs然后我用生成的exe组装了生成的exe monodis.获得以下代码:
.field public static literal int32 b = int32(0x00000008)
.field public static int32 z
// method line 2
.method public static hidebysig
default void Main (string[] args) cil managed
{
// Method begins at RVA 0x2058
.entrypoint
// Code size 23 (0x17)
.maxstack 8
IL_0000: …Run Code Online (Sandbox Code Playgroud) 我编写了这个类SomeObject,我想定义一个const这个对象的实例来保存/重用我的TestCases.我应该如何重写下面的代码来实现这种行为?
[TestFixture]
public class SomeObjectTests
{
private const SomeObject item0 = new SomeObject(0.0); // doesn't work
[TestCase(item0, ExpectedResult = 0.0)]
public double TestSomeObjectValue(SomeObject so)
{
return so.Value;
}
[TestCase(item0, ExpectedResult = "0.0")]
public string TestSomeObjectValueString(SomeObject so)
{
return so.ValueString;
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
除string之外的引用类型的const字段只能用null初始化.
我有一节课:
我想访问这些默认字符串,但C#编译器不喜欢组合Const来创建Const.
public class cGlobals
{
// Some Default Values
public class Client
{
public const string DatabaseSDF = "database.sdf";
public const string DatabaseDir = "database";
public const string DatabaseFullLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
DatabaseDir);
public const string DataSource = Path.Combine(DatabaseDir, DatabaseSDF);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法而不是硬编码字符串?我想使用特殊文件夹和Path.Combine.
谢谢
public class Foo
{
public static List<long> myList = new List<long>() { 1,2,3 }
}
Run Code Online (Sandbox Code Playgroud)
在另一种方法:
var testList = Foo.myList;
Run Code Online (Sandbox Code Playgroud)
如果我在最后一行放置断点并检查testList它会不时给我不同的长度.
当我使用ToList()上Foo.myList似乎正常运行.但为什么?
编辑:
我的问题是我做了一个ajax调用>修改Foo.myList>新的ajax调用> Foo.myList再次获取并获得修改后的值.
我经常使用String.Empty占位符,相当于"".所以我的问题,为什么不const喜欢String.Empty?他们编译相同.
// Good
private const string example = "";
// Bad
private const string example = String.Empty;
Run Code Online (Sandbox Code Playgroud)
是什么String.Empty让它无法与a一起使用const.
在 C# 中,我这样做:
public const double PAPER_SIZE_WIDTH = 8.5 * 96;
Run Code Online (Sandbox Code Playgroud)
在 F# 中定义此全局常量的最佳方法是什么?
这失败了:
[<Literal>]
let PaperSizeWidth = 8.5*96.0
Run Code Online (Sandbox Code Playgroud)
错误:这不是有效的常量表达式
TIA