是否允许在构造函数中使用此变体?

时间:2010-09-18 01:32:03

标签: c# constructor c#-4.0

我希望有一个重载的构造函数,我根据是否设置了“isFirstPost”来更改基类的值。如果它是第一篇文章,我想要rowkey = 000000.如果它不是第一篇文章,那就把它作为一个数字。

不要将此视为Azure问题......但我对C#语言更感兴趣,并使条件参数影响基类的设置。我不知道该怎么做。

public class ForumPost : TableServiceEntity
    {
        public ForumPost(string partitionKey, string rowKey): base(partitionKey, rowKey)
        {
        }
        public ForumPost(ForumThread ParentThread, bool IsFirstPost)
        {
            if (IsFirstPost)
            {
                //call constuctor with special values for base class
                //set baseclass rowkey = 0000000
            }

            else {
             //set baseclass rowkey = 1111111111
              }
         }
}

2 个答案:

答案 0 :(得分:5)

这是不可能的,因为必须在当前类的构造函数之前调用基础构造函数。你可以做的是定义一个静态函数,它将正确的id传递给基础构造函数。

public class ForumPost : TableServiceEntity
{
    public ForumPost(ForumThread ParentThread, bool IsFirstPost)
        : base(ParentThread, GetID(IsFirstPost))
    {
    }

    static string GetID(bool IsFirstPost)
    {
        return IsFirstPost ? "00000" : "11111";
    }
}

答案 1 :(得分:2)

这样做:

public class ForumPost : TableServiceEntity {
  public ForumPost(ForumThread ParentThread, bool IsFirstPost) 
    : base("partitionkey", IsFirstPost ? "0000000" : "1111111") {
  }
}

注意:我不知道你想要传递的是什么partition key

更新:要了解此构造可以采取的措施,我们可以查看C# specification

C# grammar中,我们找到了以下条目:

  

构造-初始化:
  :base(argument-list opt
  :this(argument-list opt
  参数列表:
  参数
  参数列表,参数
  参数:
  表达
  ref变量引用
  变量引用

反过来,这会扩展到语言支持的各种表达式(请参阅C.2.4部分)。这包括方法调用,数学表达式,三元条件运算符等等。

在规范的第10.11.1节(构造函数初始值设定项)中,我们发现:

  

实例构造函数声明的formal-parameter-list给出的参数范围包括该声明的构造函数初始值设定项。因此,允许构造函数初始值设定项访问构造函数的参数。 [...]实例构造函数初始值设定项无法访问正在创建的实例。因此,在构造函数初始值设定项的参数表达式中引用它是一个编译时错误,因为参数表达式通过简单名称引用任何实例成员的编译时错误。

因此,您可以像处理任何方法一样对待它。您可以访问构造函数的参数,但不能访问正在创建的实例。这意味着,如果您的逻辑涉及正在构造的实例的任何实例成员,您将不得不重新设计您的类以将它们分开

我认为我给出的答案(使用条件运算符)对于您的示例来说是最直接的。我们也可以把它带到另一个极端,并使用工厂方法来获得该逻辑的策略:

public class ForumPost : TableServiceEntity {
  public ForumPost(ForumThread ParentThread, bool IsFirstPost) 
    : base("partitionkey", 
        RowKeyStrategyFactory.Create().ResolveRowKey(IsFirstPost)) {
  }
}

在这里,您可以看到一个静态工厂方法调用,它返回一个策略实例,然后对运行所需逻辑的策略虚拟方法进行实例调用。具体的策略类将基于例如配置来决定,并且将包含在给定其参数的情况下生成右行键的逻辑。

正如您所看到的,这个问题没有单一的答案,只有您可以根据您的设计和约束来决定。但是通过了解构造可以处理的内容,您可以更好地做出正确的决定。