给出以下代码:
public static class Helpers
{
private static Char[] myChars = new Char[] {'a', 'b'};
private static Int32 myCharsSize = myChars.Length;
}
Run Code Online (Sandbox Code Playgroud)
是否保证在我使用其长度分配之前myChars将其初始化?myCharsSize
以下两种字段初始化方式之间是否存在差异?什么时候使用哪一个?
public class Class1
{
private SomeClass someclass;
public Class1()
{
someclass = new SomeClass(some arg);
}
}
Run Code Online (Sandbox Code Playgroud)
public class Class1
{
private SomeClass someclass = new SomeClass(some arg);
}
Run Code Online (Sandbox Code Playgroud)
第二个例子中的字段可以是只读的.
考虑以下C#代码:
using System;
class Program
{
static string string1 = "AAA";
static string string2 = string1 + string3;
static string string3 = "BBB";
static void Main()
{
Console.WriteLine(string2);
}
}
Run Code Online (Sandbox Code Playgroud)
我今天早些时候写了一些这样的代码,并期望string2包含值AAABBB,但它只包含它AAA.我对静态变量的初始化顺序进行了一些阅读,但在编译过程中,我似乎更喜欢某种类型的警告或错误.
两个问题:
为什么允许这样的代码成功编译?(如果答案是:"因为那是C#规范的编写方式",那么为什么它是这样编写的?有没有理由我错过了为什么这不优选总是只抛出编译时错误?)
有没有办法获得编译时警告或其他类型的标志,如果我最后无意中再次编写这种代码?
我有一个带有静态构造函数的静态类,需要花费一些时间(10-15秒)来执行并完全初始化类.为了提高性能,我决定启用这个静态类,而不是在第一次需要它时,以便在实际需要使用时准备好.
我的第一个想法是为类创建一个Initialize()方法,但由于我已经有了一个静态构造函数,这个方法似乎不需要做任何事情,除了是调用显式初始化类而不访问其他任何一个的方法公共方法或财产.拥有一种不直接做任何事情的方法对我来说似乎并不合适.
然后我想我可以将代码从静态构造函数移动到这个Initialize()方法中,但是我还希望在首次需要时对类进行初始化,并且Initialize()不显式调用该方法.
总而言之,我希望遵守以下标准:
Initialize()方法).对于用C#编写的静态类,遵循上述标准的正确方法是什么?这也适用于其他编程语言(例如Java),但我个人对使用C#编写的解决方案感兴趣.
我有一个静态类,其静态字段已初始化到位:
private static SomeType _instance = new SomeType();
Run Code Online (Sandbox Code Playgroud)
此代码是在多个平台上使用的可移植类库的一部分.在桌面平台上一切正常,但在为Windows Phone 8编译时,_instance为空.但是,如果我将初始化移动到默认的静态构造函数,则_instance会正确初始化.
我试图寻找这种行为的解释,但没有找到任何可以解释它的东西.
更新.我花了一些时间尝试创建一个可重复的步骤序列来重现错误,但在某些时候,即使我切换回原始代码,也不再发生错误.我得出的结论是,这是一个误报,问题显然是由其他原因造成的.离开它没有解释我感到不舒服,但到目前为止,我没有理由相信这与静态字段初始化有关.
我只是注意到,通过yield return返回的静态成员的初始化不是按照它们枚举的顺序,而是以相反的顺序.虽然C1实例作为迭代器的第一项返回,但首先创建C2实例.如果产生超过2个项目,则最后一个项目首先被初始化.
public abstract class B
{
private static int _number;
protected B()
{
Number = ++_number;
}
public int Number { get; private set; }
}
class C1 : B
{
public static readonly C1 Default = new C1();
}
class C2 : B
{
public static readonly C2 Default = new C2();
}
public static IEnumerable<B> GetItems()
{
yield return C1.Default;
yield return C2.Default;
}
private static void Main(string[] args)
{
var items = GetItems();
foreach (var item …Run Code Online (Sandbox Code Playgroud) 我得到了这个代码
public static class Logger
{
public static Func<ILogger> LoggerFactory;
private static readonly Lazy<ILogger> _log = new Lazy<ILogger>(LoggerFactory);
public static ILogger Instance
{
get
{
return _log.Value;
}
public static ILogger ConfigureLogging(string AppName, Version AppVersion)
{
// stuff
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个静态类在应用程序中使用:
Logger.LoggerFactory = () => Logger.ConfigureLogging(AppName, AppVersion);
Logger.Instance.Information("Starting application");
Run Code Online (Sandbox Code Playgroud)
我希望第一行设置 LoggerFactory;但是,在第一次尝试写入日志时,由于尚未设置静态 Func LoggerFactory,因此引发了异常。
这段代码有什么问题?
谢谢
我遇到了一个我想了解的C#行为.
为什么在两种情况下实例构造函数都先运行?
class Program
{
public static void Main()
{
//Singleton s = new Singleton(); case 1
var test = Singleton.Instance; // case 2
}
}
class Singleton
{
static readonly Singleton _instance = new Singleton();
public static Singleton Instance { get { return _instance; } }
private Singleton()
{
Console.WriteLine("Instance Constructor");
}
static Singleton()
{
Console.WriteLine("Static Constructor");
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
实例构造函数
静态构造函数