2

私は自分の状況をよりよく説明するために例を作りました

void Main()
{
    var a = new Lol(null);
}

public class Lol
{
    public Lol(string a, string b)
    {
        if(a == null || b == null)
        {
            throw new Exception();
        }
    }

    public Lol(Tuple<string, string> k)
        : this(k.Item1, k.Item2)
    {
    }
}

この場合NullReferenceException、2 番目のコンストラクターで を取得しています。同じ構造を維持しながらメソッド内から処理する方法はありますか、それともプライベート メソッドを作成し、両方のコンストラクターにこのメソッドを呼び出させる必要がありますか?

4

6 に答える 6

1

ロジックを変更せずに、次のことができます。

public class Lol
{
    public Lol(string a, string b)
    {
        if(a == null || b == null)
        {
            throw new Exception();
        }
    }

    public Lol(Tuple<string, string> k)
    : this(k != null ? k.Item1 : null, k != null ? k.Item2 : null)
    {
    }
}

ただし、より複雑なケースでは、これは機能しない可能性があります (ただし、複雑なロジックをコンストラクター チェーンに含めるべきではありません)。

于 2016-09-19T13:19:22.060 に答える
1

そもそもコンストラクターに null を渡さないことによって。a と b に対応するフィールドまたはプロパティを null にしたい場合は、次のようにコンストラクターに入れます。

private string a;
private string b;
public Lol()
        {
            a= null;
            b= null;
        }

Main() で次を使用します。

var a = new Lol();

null ではなく値を渡したい場合は、適切なコンストラクターを使用してください。

于 2016-09-19T13:22:45.280 に答える
1

これは、C#6 を使用する VS2015 で動作するはずです。

this(k?.Item1, k?.Item2)

ついに:

void Main()
{
    var a = new Lol(null);
}

public class Lol
{
    public Lol(string a, string b)
    {
        if(a == null || b == null)
            throw new Exception();
    }

    public Lol(Tuple<string, string> k)
        : this(k?.Item1, k?.Item2)
    {
    }
}
于 2016-09-19T13:20:16.047 に答える
0

これに対する私のアプローチは、拡張メソッドです。

public static class Requirements
{
    public static T NotNull<T>(this T value, string parameterName, string message)
        where T : class =>
        value ?? throw new ArgumentNullException(parameterName, message);

    public static T NotNull<T>(this T value, string parameterName)
        where T : class =>
        value ?? throw new ArgumentNullException(parameterName);
}

使用法:

public class Lol
{
    public Lol(string a, string b)
    {
        if(a == null || b == null)
        {
            throw new ArgumentNullException();
        }
    }

    public Lol(Tuple<string, string> k)
        : this(k.NotNull(nameof(k)).Item1, k.NotNull(nameof(k)).Item2)
    {
    }
}
于 2020-02-25T11:15:11.933 に答える