English 中文(简体)
C# [封闭式]中最好的“不是”合成物
原标题:Best "not is" syntax in C# [closed]
  • 时间:2011-08-09 19:55:22
  •  标签:
  • c#
  • wpf
  • syntax
Closed. This question is off-topic. It is not currently accepting answers.

我必须看到,我的辛迪加不会使其他开发商感到困惑。

In this example, I need to know if a parameter is a certain type.

此前,我曾打过这番话;检验“不是”的最明智、最清晰的方法是什么?

Method 1:

void MyBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    if (!(e.parameter is MyClass)) { /* do something */ }
}

方法2:

void MyBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    if (e.parameter is MyClass) { } else { /* do something */ }
}

方法3

void MyBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    var _Parameter = e.parameter as MyClass;
    if (_Parameter != null) { /* do something */ }
}

方法4:

void MyBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    var _Type = typeof(MyClass);
    switch (e.parameter.GetType())
    { 
      case _Type: /* do nothing */; break;
      default: /* do something */; break;
    }
}

[EDIT] 方法5:

void MyBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    if ((e.parameter is MyClass) == false) { /* do something */ }
}

哪一种最直接的办法?

最佳回答

I would go for 3 if you need the variable later or 1 if you don t need the variable. 2 is ugly because of the empty block.

However I think they all are straight-forward.

问题回答

这显然是一个个人意见和风格的问题,因此没有right<>em> >答案,但我认为最清楚的是:

void MyBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    if ((e.parameter is MyClass) == false) { /* do something */ }
}

I would think just making an extension method would be a clear way of doing it:

public static bool CannotBeCastAs<T>(this object actual)
    where T: class
{
    return (actual as T == null);
}

You then simply make a check like so:

if(myObject.CannotBeCastAs<SomeClass>())
{

}

Methods 1 and 3 would be my picks, depending on what I actually wanted.

方法1“做一些事情”,条件是,所通过物体并非预期的类型。 这意味着已经通过的目标可能是无效的,并且仍然通过。

方法3 “是什么东西”,如果所通过物体不是预期的类型,则或如果物体无效的话。 这基本上是一次检查,你有一个“有效”的班级,可以进一步工作。

因此,我是否想要1或3,取决于我计划做些什么。 通常,当变数是预期类型中的一吨数或无效时,我想提出一个例外。 如果我很高兴只剩下一种例外情况(例如,仅是阿古特约),我就使用方法3。 如果我想要单独检查无效,并扔下一条ArgumentNullException,那么我就使用方法1,并加上“无效支票”。

方法2在功能上是正确的,但我对方法1中的情况作一反倒,如果情况不成多余的话。

我永远不会这样做。 没有必要用简单易懂的开关说明,令人困惑,特别是以你重新使用的方式。

To me, Method 1 is the most straight-forward, both on its own and by convention. This is the syntax I ve seen the most if you just need to know if an object "is-a" certain class.

如果你实际上需要做某些类别的物体,那么方法3就是去做的。

我认为,方法1是最好的。 这非常明显,我可以沿途走下去。 方法2引入了不必要合成物,很容易通过方法1加以纠正。 方法3要求我比另外两种办法(原样,但现在!)还要利用所需的额外空间。

记号是供人们读写的,只有经过机器才能执行。 每次都明确。

如果你想要做到合适和可以读:

void MyBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    bool isMyClass = e.parameter is MyClass;
    if (!isMyClass) // or isMyClass == false
    { 
        /* do something */ 
    }
}

我总是尽量不要把太多的逻辑放在单一的法典中,特别是在条件的情况下。 我认为,这种检查和否定的操作者可能会在一眼中 par。

www.un.org/Depts/DGACM/index_spanish.htm 方法5:(不同关键)

public static class TypeExtensions
{
    public static bool IsNotTypeOf<T, X>(this T instance, X typeInstance)
    {
        return instance.GetType() != typeInstance.GetType();
    }
}

// ...

if(e.parameter.IsNotTypeOf(MyClass)) { /* do something */ } ;

我认为,宽恕功能应始终与你的申请中所使用的任何宽度模式相称。 例如,如果您使用:

If (foo != bar)
{
    //Do Something
}

那么,这应该是你如何在任何时候都使用宽松的固定功能。 我在阅读其他民族法典时所表现出的最大 b(如果他们使用《法典》Rush或Resharper的话,情况尤其如此)是,除了显示担心之外,没有必要的恐惧感增加。

我并不是说上述是最好的比对模式,而是使用大家所感到的舒适感,而我要从中看到的是,这种模式与其使用的一致性无关。

个人,自此 C#与VB相比是一种可怕的语言。 净额一将使用长式声明或派任(除变式外)超过更宽松的辛迪加,以帮助以后的可读性。

我喜欢联尼特·阿森特的一位成员采用的办法:

Assert.InstanceOf<MyType>(objectInstance);

BTW, If you have a set of checks whether object is of specific type like:

if(objectInstance is TypeA)
{
  // ...
}else
{
  if(objectInstance is TypeC)
  {
    // ...
  }
}

某些设计问题,如在几类人之间搭配的 coup合,因此,应考虑采用其他办法,如注入协会地图或按每类算法绘制地图。

IDictionary<Type, Func<TParameter>>




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...