【问题标题】:C# - Problem with Order of static InitializersC# - 静态初始化程序的顺序问题
【发布时间】:2019-09-17 11:28:48
【问题描述】:

我有以下课程

 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;

所以,我进行了谷歌搜索并在这里找到了同样的问题Order of Static Constructor/Initializers in C#

在我的例子中,这些只是包和存储过程,没有做任何复杂的事情。我有多个包和存储过程,我只举了两个作为示例。

那么,从代码库中的任何位置编写和调用这些的最佳方法是什么?

【问题讨论】:

  • 你说你有一个“问题”并且有“问题”。介意告诉我们问题是什么
  • 为什么最后两个字段(PRODUCT_PACKAGE_NAMEADDRESS_PACKAGE_NAME)必须定义为 static readonly,而它们只能设置为 const 并一路解决您的问题?跨度>
  • @haim770 这解决了我遇到的问题。但你能解释一下吗?
  • 只需更改字段的顺序.....首先声明这些:PRODUCT_PACKAGE_NAME,ADDRESS_PACKAGE_NAME.....在这种情况下似乎顺序很重要

标签: c#


【解决方案1】:

类中的静态初始化程序按文本顺序执行。目前正在格式化插入的字符串文字,而 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";
}

此时,编译器将验证您没有在常量之间引入循环。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2021-07-12
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多