我有一个只有静态属性和静态构造函数的静态类。当我尝试访问或设置属性的值(带有支持字段)时,不会调用静态构造函数。但是,如果我定义一个静态方法并尝试调用它,则执行构造函数。
我认为属性只是语法糖,并在内部翻译为方法。那么为什么运行时以不同的方式对待它们呢?我的课程定义如下:
编辑:我已经删除了我正在初始化内联的_fileEncodingText值的代码。
编辑:调用构造函数但未设置属性。这可能是因为“静态构造函数只运行零次或一次,并在静态方法调用或实例创建之前运行”。 Igor Ostrovsky和Eric Lippert在他们的博客中对此进行了解释
http://ericlippert.com/2013/01/31/the-no-lock-deadlock/
内部静态类AppSettings { 静态AppSettings() { FileEncodingText =“UTF8”; }
android:scaleType="fitXY" // or desired scale type
android:adjustViewBounds="true"
}
答案 0 :(得分:3)
我无法重现这个问题。
以下程序打印
onSelectRow: function (id) {
if (id && id !== lastSel) {
jQuery(this).restoreRow(lastSel);
lastSel = id;
var celValue = jQuery(this).getRowData(id);
var rowCount = $("#cart").getGridParam("reccount") + 1;
if (celValue.menge_min == celValue.menge_max )
celValue.menge = celValue.menge_min;
var newID = id + rowCount;
jQuery("#cart").jqGrid('addRowData', newID, celValue);
}
}
正如所料。
因此答案似乎是你在测试中的某个地方犯了错误。
AppSettings - Static constructor called.
UTF8
答案 1 :(得分:3)
当我尝试访问或设置属性值时(带有支持 field)不调用静态构造函数。
我无法复制您所看到的问题,上面似乎没有在我的示例中发生(请参阅.NET Fiddle链接 - https://dotnetfiddle.net/ikIhw3)。
设置FileEncodingText属性时会抛出异常,该属性将_fileEncodingText
支持字段设置回UTF8。这可能是你所看到的原因吗?
以下内容(摘自上述.NET小提琴):
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
值时会在构造函数中抛出此内容吗?
答案 2 :(得分:1)
根据MSDN文档
在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。
请注意,文档说"静态成员"所以"静态属性"之间没有区别。和"静态方法" [在你的情况下]