我有以下课程
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#
处发现了相同的问题就我而言,这些只是包和存储过程,没有做任何复杂的事情。我有多个软件包和存储过程,仅举两个例子。
那么,从代码库中的任何地方编写和调用它们的最佳方法是什么?
答案 0 :(得分:3)
类中的静态初始值设定项以文本顺序执行。当前,当PRODUCT_PACKAGE_NAME
和ADDRESS_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";
}
到那时,编译器将确认您没有在常量之间引入循环。