我是初学者和编程人员.我有一个简单的问题 - 关于静态/非静态变量的最佳实践是什么.
我有一个变量private int x,它属于y类.要访问此变量,我需要引用y.如果x是静态的,我可以访问此变量而不引用y.
在类y中的几个方法将引用此值的情况下,哪种方法最好?
希望这是有道理的,我的问题不是太基础!
非常感谢
关于这个问题有很多问题,但没有一个(除了一个,但仍然是一个短的)正在处理以下场景.
来自C#4书:

马克还写道:
如果更改const的值,则需要重建所有客户端
题 :
1)为什么?是static readonly和const- static?
2)实际值保存在哪里?
3)如何使一个领域static readonly实际上solve这个问题"落后于现场"?
我有一个有静态成员的类.据我所知,所有静态成员对于类的所有实例都是通用的,这意味着静态成员只会被分配一次内存.这个内存分配在哪里(堆栈或堆)以及何时分配这个内存?
编辑:此内存与实例级内存不同.如何引用这个内存?在编译时是否分配了这个内存?
以下代码允许我为每种类型存储一个值T:
public static class MyDict<T> {
public static T Value;
}
Run Code Online (Sandbox Code Playgroud)
我可以存储尽可能多的值,并且编译器之前不知道我要使用的类型.这些静态字段值的存储方式和位置在哪里?
更新:显然它存储在内存中,但我想知道这个内存.是堆吗?它是一些特殊的CLR内存吗?怎么称呼?还有什么方式存储?
更新2:JITter MyDict<__Canon>为所有引用类型参数生成单个实现MyDict<T>.然而,这些值是分开存储的.我猜每个类型参数仍然有一些per-type-argument结构,而当vtable链接到JITted时MyDict<__Canon>,字段是分开的.我对吗?
可能是我的硬件是罪魁祸首,但在测试过程中,我发现:
void SomeFunction(AType ofThing) {
DoSomething(ofThing);
}
Run Code Online (Sandbox Code Playgroud)
......快于:
private AType _ofThing;
void SomeFunction() {
DoSomething(_ofThing);
}
Run Code Online (Sandbox Code Playgroud)
我认为它与编译器如何将其转换为CIL有关.有谁能解释一下,具体来说,为什么会发生这种情况?
以下是它发生的一些代码:
public void TestMethod1()
{
var stopwatch = new Stopwatch();
var r = new int[] { 1, 2, 3, 4, 5 };
var i = 0;
stopwatch.Start();
while (i < 1000000)
{
DoSomething(r);
i++;
}
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
i = 0;
stopwatch.Restart();
while (i < 1000000)
{
DoSomething();
i++;
}
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
}
private void DoSomething(int[] arg1)
{
var r = arg1[0] * arg1[1] …Run Code Online (Sandbox Code Playgroud) 我读了一篇让我对内存分配感到困惑的文章,其中说:
Singleton对象存储在堆上,而静态类存储在堆栈中.
链接是:http: //www.dotnetjalps.com/2013/06/Static-vs-Singleton-in-Csharp-Difference-between-Singleton-and-Static.html
但在一些Stackoverflow问题中,例如
它被描述为
静态变量存储在堆上,无论它们是声明为引用类型还是值类型.无论创建多少个实例,总共只有一个插槽.
所以我对静态类的堆栈或堆存储感到困惑.如何为静态类分配内存?为什么?如何为单例类分配内存?
在这个小提琴中,我们将静态字段分配给实例字段.当我们更改静态实例时,实例一仍然具有初始值.这是为什么?我们认为两者都应该指同一个对象,但似乎它们不是.
using System;
public class Program
{
public static string StaticString;
public string InstanceString;
public static void Main()
{
Program.StaticString = "foo";
var p = new Program();
p.InstanceString = Program.StaticString;
Program.StaticString = "bar";
Console.WriteLine(p.InstanceString);
}
}
Run Code Online (Sandbox Code Playgroud)
我们真的希望这可以打印,bar但它打印出来foo.