【问题标题】:Static parameters in C# methodsC# 方法中的静态参数
【发布时间】:2014-04-09 10:39:01
【问题描述】:

我对 C# 中的静态类在方法中的使用有疑问。假设我们在另一个类中有一个带有两个参数 int 和 Enum 的方法。

public void DemoMethod(int pricePerTenant , TenantType tenantType){
    //Method implementation    
}

如果我们实现一个静态类而不是 Enum,C# 不允许将静态类作为方法参数传递

public static class TenantType
{
   public static readonly int TenantAdmin = 1;
   public static readonly int TenantUser = 2;
   public static readonly int PublicUser = 3;
}

//With static class parameters
public void DemoMethod(int pricePerTenant , TenantType tenantType){
    //Method implementation    
}

为什么 C# CLR 拒绝将静态类作为参数?

谢谢

【问题讨论】:

    标签: c# .net class static clr


    【解决方案1】:

    您永远无法实例化 TenantType - 因此您可以可能传递给 DemoMethod 的唯一值将是 null。想一想您将如何调用该方法 - 如果您希望调用(比如说)DemoMethod(10, TenantType.TenantUser),那么无论如何这将是一个 int 参数而不是 TenantType。

    基本上,静态类永远不会有实例,因此允许它们在您可能是考虑实例的任何地方使用是没有意义的 - 包括方法参数和类型参数。您应该感谢 C# 这么早就发现了您的错误,基本上 - 这是静态类的好处之一。

    在这种情况下,听起来你真的应该有一个枚举:

    public enum TenantType
    {
        Admin = 1,
        User = 2,
        PublicUser = 3
    }
    

    此时您可以接受它作为参数 - 您仍然可以调用 DemoMethod(10, TenantType.User),但以类型安全的方式调用,除非该方法真正关心整数映射,它永远不必看到它。

    【讨论】:

      【解决方案2】:

      因为如果你指定TenantType tenantType 作为参数,你告诉C#,你需要一个TenantType 的instance。而且因为你没有通过一个,它是行不通的。

      这反过来会:

      public void DemoMethod(int pricePerTenant, int tenantType) {
      
      }
      
      DemoMethod(3, TenantType.TenantAdmin);
      

      但是。有一个类似于你的方法,它实际上会起作用:

      public class TenantType {
      
          private int value;
      
          private TenantType(int newValue)
          {
              value = newValue;
          }
      
          public override bool Equals(object obj)
          {
              return (obj is TenantType && (obj as TenantType).value == this.value;
          }
      
          public override int GetHashCode()
          {
              return value;
          }
      
          public static bool operator == (TenantType left, TenantType right)
          {
              return left.Equals(right);
          }
      
          public static bool operator != (TenantType left, TenantType right)
          {
              return !(left.Equals(right));
          }
      
          public static TenantType Admin = new TenantType(1);
          public static TenantType User = new TenantType(2);
          public static TenantType PublicUser = new TenantType(3);
      }
      
      public void DemoMethod(int pricePerTenant, TenantType tenantType)
      {
      
      }
      
      DemoMethod(4, TenantType.Admin);
      

      如您所见,这比使用枚举的最简单解决方案需要更多的工作(毕竟,这正是创建它们的目的)。

      【讨论】:

        猜你喜欢
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 2019-01-21
        相关资源
        最近更新 更多