在静态 class 定义中获得 SA1401
Got SA1401 in static class definition
所以首先我有通用的 class 实现了一些东西。
public class MyGenericClass<T> where T : class
{
...
public T SomeFunction(T t) {...}
...
}
然后我想要两个 "instance" 这个通用的 class (不同类型),可以在我的项目中随处使用,但不知道该怎么做。
使用全局可能是一个选项,但我想制作另一个包含不同通用 class.
的静态 class
public static class CosmosDBHelper
{
public static MyGenericClass<T1> t1;
public static MyGenericClass<T2> t2;
}
但是StyleCop会报SA1401错误"Field should be private"。我找到了以下解决方案,但它看起来很多余。
public static class CosmosDBHelper
{
private static MyGenericClass<T1> t1;
public static MyGenericClass<T1> T1 { get { return t1; } }
private static MyGenericClass<T2> t2;
public static MyGenericClass<T2> T2 { get { return t2; } }
}
有没有更好的方法?
谢谢,
这与在静态 class 中使用通用 class 无关。规则 SA1401 简单地指出 class 字段不应该是 public。
阅读文档,我们发现"a violation of this rule occurs whenever a field in a class is given non-private access. For maintainability reasons, properties should always be used as the mechanism for exposing fields outside of a class, and fields should always be declared with private access. This allows the internal implementation of the property to change over time without changing the interface of the class."
有两种解决方案:
- 将字段设为私有:
private static MyGenericClass<T1> t1;
private static MyGenericClass<T2> t2;
- 将字段更改为属性:
public static MyGenericClass<T1> t1 { get; } // Add a set to make it writeable
public static MyGenericClass<T2> t2 { get; }
或者,如果需要,将两者组合(其中私有字段是 public 属性 的支持字段,正如您在解决方案中所做的那样)。
此外,为了清楚起见,传递给 MyGenericClass
的类型必须在创建字段或基于它们的 属性 时定义。属性 t1
和 t2
应该是特定的、不同的类型,并且应该这样声明:
public static MyGenericClass<SomeClass> MyCustomClassInstance { get; }
public static MyGenericClass<string> MyStringClassInstance { get; }
所以首先我有通用的 class 实现了一些东西。
public class MyGenericClass<T> where T : class
{
...
public T SomeFunction(T t) {...}
...
}
然后我想要两个 "instance" 这个通用的 class (不同类型),可以在我的项目中随处使用,但不知道该怎么做。
使用全局可能是一个选项,但我想制作另一个包含不同通用 class.
的静态 classpublic static class CosmosDBHelper
{
public static MyGenericClass<T1> t1;
public static MyGenericClass<T2> t2;
}
但是StyleCop会报SA1401错误"Field should be private"。我找到了以下解决方案,但它看起来很多余。
public static class CosmosDBHelper
{
private static MyGenericClass<T1> t1;
public static MyGenericClass<T1> T1 { get { return t1; } }
private static MyGenericClass<T2> t2;
public static MyGenericClass<T2> T2 { get { return t2; } }
}
有没有更好的方法?
谢谢,
这与在静态 class 中使用通用 class 无关。规则 SA1401 简单地指出 class 字段不应该是 public。
阅读文档,我们发现"a violation of this rule occurs whenever a field in a class is given non-private access. For maintainability reasons, properties should always be used as the mechanism for exposing fields outside of a class, and fields should always be declared with private access. This allows the internal implementation of the property to change over time without changing the interface of the class."
有两种解决方案:
- 将字段设为私有:
private static MyGenericClass<T1> t1;
private static MyGenericClass<T2> t2;
- 将字段更改为属性:
public static MyGenericClass<T1> t1 { get; } // Add a set to make it writeable
public static MyGenericClass<T2> t2 { get; }
或者,如果需要,将两者组合(其中私有字段是 public 属性 的支持字段,正如您在解决方案中所做的那样)。
此外,为了清楚起见,传递给 MyGenericClass
的类型必须在创建字段或基于它们的 属性 时定义。属性 t1
和 t2
应该是特定的、不同的类型,并且应该这样声明:
public static MyGenericClass<SomeClass> MyCustomClassInstance { get; }
public static MyGenericClass<string> MyStringClassInstance { get; }