有没有办法在静态构造函数中将函数标记为仅 called/callable?
Is there a way to mark a function as only called/callable from a static constructor?
我的 类 之一有一个相当大的静态构造函数,我想重构它以将初始化的各个位封装在静态函数中。
这个静态构造函数做的很多事情之一是初始化静态只读字段的值。但是,当我尝试将这些部分移动到函数中时,显然编译器不会让我这样做,因为这些只能在静态构造函数中设置。这是有道理的,因为它不知道我只打算从我的静态构造函数中调用这些函数。
有什么办法解决这个问题吗?例如我可以在函数上添加某种属性来告诉编译器函数只能从静态构造函数调用吗?
您可以在静态构造函数中定义局部函数;
public class MyClass {
public static readonly int Value;
static MyClass(){
Value = Calc(1);
return;
int Calc(int a) => a;
}
}
C# 编译器会将这些局部函数转换为静态方法,unpronounceable names。
您可以使用 static
和 private
关键字
using System;
public class User {
public static readonly string Name;
static User(){
Name = GetName();
}
//`private` function to only be called in static class itself
private static string GetName() {
return "Testing";
}
}
public class Program
{
public static void Main()
{
Console.WriteLine(User.Name);
}
}
这个解决方案的一个旁注是,它可以帮助您防止外部函数的调用,但不能防止内部函数在内部调用。
我的 类 之一有一个相当大的静态构造函数,我想重构它以将初始化的各个位封装在静态函数中。
这个静态构造函数做的很多事情之一是初始化静态只读字段的值。但是,当我尝试将这些部分移动到函数中时,显然编译器不会让我这样做,因为这些只能在静态构造函数中设置。这是有道理的,因为它不知道我只打算从我的静态构造函数中调用这些函数。
有什么办法解决这个问题吗?例如我可以在函数上添加某种属性来告诉编译器函数只能从静态构造函数调用吗?
您可以在静态构造函数中定义局部函数;
public class MyClass {
public static readonly int Value;
static MyClass(){
Value = Calc(1);
return;
int Calc(int a) => a;
}
}
C# 编译器会将这些局部函数转换为静态方法,unpronounceable names。
您可以使用 static
和 private
关键字
using System;
public class User {
public static readonly string Name;
static User(){
Name = GetName();
}
//`private` function to only be called in static class itself
private static string GetName() {
return "Testing";
}
}
public class Program
{
public static void Main()
{
Console.WriteLine(User.Name);
}
}
这个解决方案的一个旁注是,它可以帮助您防止外部函数的调用,但不能防止内部函数在内部调用。