C#-静态初始化程序的顺序问题

时间:2019-04-28 18:13:21

标签: c#

我有以下课程

 public class OracleStoredProcedures
{
    public static readonly string GET_ALL_PRODUCTS_BY_ID = $"{PRODUCT_PACKAGE_NAME}.GET_ALL_PRODUCTS_BY_ID";

    public static readonly string GET_LATEST_PRODUCTS = $"{PRODUCT_PACKAGE_NAME}.GET_LATEST_PRODUCTS";

    public static readonly string GET_ADDRESS_BY_ID = $"{ADDRESS_PACKAGE_NAME}.GET_ADDRESS_BY_ID";

    private static readonly string PRODUCT_PACKAGE_NAME = "DATABASE.PRODUCT_PKG";

    private static readonly string ADDRESS_PACKAGE_NAME = "DATABASE.ADDRESS_PKG";
}

尝试致电该字段时遇到问题

var getProducts = OracleStoredProcedures.GET_LATEST_PRODUCTS;

因此,我进行了google搜索,并在Order of Static Constructor/Initializers in C#

处发现了相同的问题

就我而言,这些只是包和存储过程,没有做任何复杂的事情。我有多个软件包和存储过程,仅举两个例子。

那么,从代码库中的任何地方编写和调用它们的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

类中的静态初始值设定项以文本顺序执行。当前,当PRODUCT_PACKAGE_NAMEADDRESS_PACKAGE_NAME的默认值为null时,将对插值字符串文字进行格式化。因此,您可以将其重写为(同时将名称固定为更常规的名称):

public class OracleStoredProcedures
{
    private static readonly string ProductPackageName = "DATABASE.PRODUCT_PKG";    
    private static readonly string AddressPackageName = "DATABASE.ADDRESS_PKG";

    public static readonly string GetAllProductsById = $"{ProductPackageName}.GET_ALL_PRODUCTS_BY_ID";
    public static readonly string GetLatestProducts = $"{ProductPackageName}.GET_LATEST_PRODUCTS";
    public static readonly string GetAddressById = $"{AddressPackageName}.GET_ADDRESS_BY_ID";
}

或者,您可以将两个程序包名称设为const字段,此时不需要分别对其进行初始化。实际上,如果您使用字符串串联而不是插值,那么所有这些 都可以声明为const

public class OracleStoredProcedures
{
    private const string ProductPackageName = "DATABASE.PRODUCT_PKG";    
    private const string AddressPackageName = "DATABASE.ADDRESS_PKG";

    public const string GetAllProductsById = ProductPackageName + ".GET_ALL_PRODUCTS_BY_ID";
    public const string GetLatestProducts = ProductPackageName + ".GET_LATEST_PRODUCTS";
    public const string GetAddressById = AddressPackageName + ".GET_ADDRESS_BY_ID";
}

到那时,编译器将确认您没有在常量之间引入循环。

相关问题