316

これはばかげた質問ですが、このコードを使用して、何かが特定のタイプであるかどうかを確認できます...

if (child is IContainer) { //....

「NOT」インスタンスをチェックするためのよりエレガントな方法はありますか?

if (!(child is IContainer)) { //A little ugly... silly, yes I know...

//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) { 
if (child aint IContainer) { 
if (child isnotafreaking IContainer) { 

はい、はい...ばかげた質問...

コードがどのように見えるかについていくつかの質問があるので、それはメソッドの開始時の単純な戻りです。

public void Update(DocumentPart part) {
    part.Update();
    if (!(DocumentPart is IContainer)) { return; }
    foreach(DocumentPart child in ((IContainer)part).Children) {
       //...etc...
4

13 に答える 13

324
if(!(child is IContainer))

移動する唯一の演算子です(演算子はありませんIsNot)。

それを行う拡張メソッドを作成できます。

public static bool IsA<T>(this object obj) {
    return obj is T;
}

次に、それを使用して次のことを行います。

if (!child.IsA<IContainer>())

そして、あなたはあなたのテーマに従うことができます:

public static bool IsNotAFreaking<T>(this object obj) {
    return !(obj is T);
}

if (child.IsNotAFreaking<IContainer>()) { // ...

更新(OPのコードスニペットを考慮):

as後で実際に値をキャストするので、代わりに次を使用できます。

public void Update(DocumentPart part) {
    part.Update();
    IContainer containerPart = part as IContainer;
    if(containerPart == null) return;
    foreach(DocumentPart child in containerPart.Children) { // omit the cast.
       //...etc...
于 2009-05-01T14:35:46.980 に答える
116

あなたはこのようにそれを行うことができます:

object a = new StreamWriter("c:\\temp\\test.txt");

if (a is TextReader == false)
{
   Console.WriteLine("failed");
}
于 2009-05-01T14:47:02.540 に答える
45

C#9.0の新機能

https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/#logical-patterns

if (part is not IContainer)
{
    return;
}

元の回答

これはまだ言及されていません。それは動作し、使用するよりも見栄えが良いと思います!(child is IContainer)

if (part is IContainer is false)
{
    return;
}
于 2019-01-23T20:15:53.770 に答える
16

C#9(.NET 5でリリース)には、論理パターンandとが含まれています。これによりornotこれをよりエレガントに記述できます。

if (child is not IContainer) { ... }

同様に、このパターンを使用してnullをチェックできます。

if (child is not null) { ... }
于 2020-05-28T06:16:42.973 に答える
10

なぜelseを使用しないのですか?

if (child is IContainer)
{
  //
}
else
{
  // Do what you want here
}

そのきちんとしたそれはなじみがあり、シンプルですか?

于 2009-05-01T14:38:01.220 に答える
10

使用方法は問題ありません、一連の拡張メソッドを作成して、「「NOT」インスタンスをチェックするためのより洗練された方法」を作成できます。

public static bool Is<T>(this object myObject)
{
    return (myObject is T);
}

public static bool IsNot<T>(this object myObject)
{
    return !(myObject is T);
}

次に、次のように書くことができます。

if (child.IsNot<IContainer>())
{
    // child is not an IContainer
}
于 2009-05-01T14:45:38.987 に答える
5

ぶさいくな?同意しません。他の唯一の方法(私は個人的にこれは「醜い」と思います):

var obj = child as IContainer;
if(obj == null)
{
   //child "aint" IContainer
}
于 2009-05-01T14:38:45.523 に答える
3

演算子はisブール結果に評価されるため、ブールで実行できることなら何でも実行できます。無効にするには、!演算子を使用します。このためだけに別のオペレーターが必要なのはなぜですか?

于 2009-05-01T14:41:59.743 に答える
3

拡張メソッドIsNot<T>は、構文を拡張するための優れた方法です。覚えておいてください

var container = child as IContainer;
if(container != null)
{
  // do something w/ contianer
}

次のようなことをするよりもパフォーマンスが優れています

if(child is IContainer)
{
  var container = child as IContainer;
  // do something w/ container
}

あなたの場合、メソッドから戻っているので問題ではありません。つまり、型のチェックと直後の型変換の両方を行わないように注意してください。

于 2009-05-01T16:34:49.643 に答える
3

これは括弧の問題を回避するものではありませんが、Google経由でここにアクセスするために、コードの残りの部分を少しすっきりさせるために、新しい構文が存在することに注意してください(C#7以降)。

if (!(DocumentPart is IContainer container)) { return; }
foreach(DocumentPart child in container.Children) {
    ...

これにより、ダブルキャスト、ヌルチェック、およびヌルになる可能性のあるスコープで使用可能な変数が回避されます。

于 2018-03-07T16:12:02.190 に答える
2

通常はIS演算子が最善の方法ですが、状況によっては使用できる代替手段があります。as演算子を使用して、nullをテストできます。

MyClass mc = foo as MyClass;
if ( mc == null ) { }
else {}
于 2009-05-01T14:40:48.093 に答える
-1

これを使います

If(!(オブジェクトは車)){

}

于 2021-09-08T00:49:47.747 に答える
-3
if (child is IContainer ? false : true)
于 2014-04-23T16:43:14.337 に答える