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

5

例子

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

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

我调用了继承的ClassB构造函数,传入了一个null。ToLower()会在传入null时抛出异常,我想在此之前检查是否为null。我该如何做到这一点?


如果这个字符串为空,你想要做什么? - Andrew
很可能将 null 传递给 ClassA。其他选项包括传递 String.Empty 或某个“默认”字符串。 - danmine
@danmine:这很容易克服;选择一个被接受的答案并点赞其他答案;只有5个声望的差别。 - Fredrik Mörk
在我看来,我认为这会对其他答案构成不公平。人们会花费很多精力来思考问题的答案。绿色的勾选标记会将特定的答案放在最上面,并吸引人们的视线,即使其他答案也同样有价值。 - danmine
5个回答

7

简单。使用空合并运算符

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

或者使用三元运算符

来实现。

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

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

1
我总是忘记这个 ?? 运算符,谢谢你提醒我 :) - Gerrie Schenck
哇,我一直在试图把简单的东西变得复杂!我甚至不知道??的存在。 - danmine

6

试试这个:

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

3

试试这个

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

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

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) { }
}

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

1
你应该在基类中检查someString是否为空,并相应地采取行动,否则你可以像这样做,但我认为它非常难以阅读。
public class ClassB : ClassA
{
    public ClassB(string someString):base((String.IsNullOrEmpty(someString)) ? String.Empty : someString.ToLower()){}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接