如何在C#中对继承的基础构造函数进行操作?

时间:2010-02-19 07:38:46

标签: c#

实施例

public class ClassA
{
    public ClassA(string someString){}
}

public class ClassB : ClassA
{
    public ClassB(string someString):base(someString.ToLower()){}
}

我调用继承的ClassB构造函数。我传入null。 ToLower()在null上抛出异常。我希望在此之前检查null。我怎么能这样做?

5 个答案:

答案 0 :(得分:7)

简单。使用null-coalescing operator

public ClassB(string someString) : 
    base((someString ?? "").ToLower())
{
}

或使用ternary operator

public ClassB(string someString) : 
    base(someString == null ? "" : someString.ToLower())
{
}

更好的是,我建议您向ClassB添加一个无法构建的构造函数,它将调用base(string.Empty)

答案 1 :(得分:6)

试试这个:

base(someString == null ? string.Empty : someString.ToLower())

答案 2 :(得分:3)

试试这个

public class ClassA
{
    public ClassA(string someString) { }
}

public class ClassB : ClassA
{
    public ClassB(string someString) : base(someString == null  ? "" :  someString.ToLower()) { }
}

答案 3 :(得分:2)

你已经对你的问题得到了答案,但我只是想补充一点,这种方法让我觉得有些奇怪。调用者是否真的有责任确保输入是小写的?我肯定会在基类构造函数中进行此检查和转换:

class Base
{
    private string _someString;
    public Base(string someString)
    {
        _someString = someString != null ? someString.ToLower() : null;
    }
}

class Derived : Base
{
    public Derived(string someString) : base(someString) { }
}

这样,基类不依赖于派生类如何选择传递参数。

答案 4 :(得分:1)

您应该检查基类中的someString是否为null并采取相应的行动,否则您可以执行此类操作,但我认为它非常难以理解。

public class ClassB : ClassA
{
    public ClassB(string someString):base((String.IsNullOrEmpty(someString)) ? String.Empty : someString.ToLower()){}
}