我有一个只具有静态属性的静态类和一个静态构造函数。当我尝试访问或设置属性值(带有支持字段)时,静态构造函数不会被调用。但是,如果我定义了一个静态方法并试图调用它,就会执行构造函数。
我相信属性只是语法糖,在内部被翻译成方法。那么,为什么运行时对它们的处理方式不同呢?我的类定义如下:
编辑:我已经删除了初始化_fileEncodingText值的代码。
编辑:调用构造函数,但未设置属性。这可能是因为“静态构造函数精确地运行0或1次,并且在静态方法调用或创建其类型的实例之前运行”。Igor Ostrovsky和Eric Lippert在他们的博客中解释了这一点。
发布于 2016-02-29 12:40:26
当我尝试访问或设置属性值(带有支持字段)时,静态构造函数不会被调用。
我无法复制您所看到的问题,在我的示例中,上述情况似乎没有发生(请参阅.NET Fiddle链接- https://dotnetfiddle.net/ikIhw3)。
当设置FileEncodingText属性时,似乎会引发异常,该属性将_fileEncodingText后备字段设置为UTF8。这可能是你看到的原因吗?
以下内容(摘自上述.NET Fiddle):
internal static class AppSettings
{
static AppSettings()
{
Console.WriteLine("In constructor");
FileEncodingText = "UTF8";
}
private static string _fileEncodingText = "UTF8";
public static string FileEncodingText
{
get { return _fileEncodingText; }
set
{
Console.WriteLine("Setting value: " + value);
string oldValue = _fileEncodingText;
_fileEncodingText = value;
try
{
FileEncoding = Encoding.GetEncoding(value);
}
catch (System.Exception)
{
Console.WriteLine("Exception");
_fileEncodingText = oldValue;
FileEncoding = Encoding.UTF8;
}
}
}
public static Encoding FileEncoding { get; private set; }
}
public class Program
{
public static void Main()
{
AppSettings.FileEncodingText = "UTF16";
Console.WriteLine(AppSettings.FileEncodingText);
}
}下列产出的结果:
In constructor
Setting value: UTF8
Exception
Setting value: UTF16
Exception
UTF8更新:
进一步钻研异常,这是我在小提琴中看到的输出。也许添加一些日志记录是值得的,看看异常是否被抛到了您的头上?
Run-time exception (line 45): The type initializer for 'AppSettings' threw an exception.
Stack Trace:
[System.ArgumentException: 'UTF8' is not a supported encoding name.
Parameter name: name]
at AppSettings.set_FileEncodingText(String value): line 34
at AppSettings..cctor(): line 9
[System.TypeInitializationException: The type initializer for 'AppSettings' threw an exception.]
at Program.Main(): line 45正如您所看到的,在设置默认的UTF8值时,这是在构造函数中抛出的?
发布于 2016-02-29 12:35:57
我不能重复这个问题。
下列程序打印
AppSettings - Static constructor called.
UTF8如预期的那样。
因此,答案似乎是你在测试中犯了一个错误。
using System;
using System.Text;
namespace Demo
{
internal static class AppSettings
{
static AppSettings()
{
FileEncodingText = "UTF8";
Console.WriteLine("AppSettings - Static constructor called.");
}
private static string _fileEncodingText = "UTF8";
public static string FileEncodingText
{
get { return _fileEncodingText; }
set
{
string oldValue = _fileEncodingText;
_fileEncodingText = value;
try
{
FileEncoding = Encoding.GetEncoding(value);
}
catch (System.Exception)
{
_fileEncodingText = oldValue;
FileEncoding = Encoding.UTF8;
}
}
}
public static Encoding FileEncoding { get; private set; }
}
class Program
{
static void Main()
{
Console.WriteLine(AppSettings.FileEncodingText);
}
}
}发布于 2016-02-29 12:51:42
https://stackoverflow.com/questions/35698518
复制相似问题