静态类,静态构造函数和静态属性

时间:2016-02-29 11:36:07

标签: c#

我有一个只有静态属性和静态构造函数的静态类。当我尝试访问或设置属性的值(带有支持字段)时,不会调用静态构造函数。但是,如果我定义一个静态方法并尝试调用它,则执行构造函数。

我认为属性只是语法糖,并在内部翻译为方法。那么为什么运行时以不同的方式对待它们呢?我的课程定义如下:

编辑:我已经删除了我正在初始化内联的_fileEncodingText值的代码。

编辑:调用构造函数但未设置属性。这可能是因为“静态构造函数只运行零次或一次,并在静态方法调用或实例创建之前运行”。 Igor Ostrovsky和Eric Lippert在他们的博客中对此进行了解释

  1. http://blogs.msdn.com/b/pfxteam/archive/2011/05/03/10159682.aspx
  2. http://ericlippert.com/2013/01/31/the-no-lock-deadlock/

    内部静态类AppSettings {     静态AppSettings()     {         FileEncodingText =“UTF8”;     }

    android:scaleType="fitXY"  // or desired scale type
    android:adjustViewBounds="true"
    

    }

3 个答案:

答案 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文档

  

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。

请注意,文档说"静态成员"所以"静态属性"之间没有区别。和"静态方法" [在你的情况下]