c#truthy和falsy值

时间:2009-05-27 01:53:44

标签: c# .net

在JavaScript中有一个truthy和falsy值的想法。

e.g。

  • 0:总是假的
  • 1:永远是真的
  • '0':永远是真的
  • '1':永远是真的

.NET框架上的C#语言中是否存在等效的虚假和虚假值列表?

我想知道的原因是我发现自己在做以下事情

if(obj != null)
{
   // Do something with the object
}

当我写下以下内容时

if(obj)
{
   // Do something with the object
}

10 个答案:

答案 0 :(得分:40)

C#只有文字truefalse值。

C#要求您在声明中非常明确,因为它是一种强类型语言,而JavaScript则可以在需要时进行隐式转换。

重要的是要注意“强类型”并不是C#不会隐式转换为“truthy / falsy”值的原因。该语言故意试图避免其他编译语言(如C ++)的陷阱,其中某些值可能是真实的,例如“0”或“1”这可能会让你犯一个语法错误,你可能不会当代码出现异常行为时,请注意直到运行时。

答案 1 :(得分:25)

默认情况下,C#仅提供truefalse

但是,通过实施true运算符,您可以让自己的自定义类型变为“真实”和“虚假”。当类型实现true运算符时,该类型的实例可以用作布尔表达式。来自C# Language Specification的第7.19节:

  

当布尔表达式的类型无法隐式转换为bool但实现operator true时,则在对表达式求值之后,将调用该类型提供的运算符true实现以生成bool值。

     

§11.4.2中的DBBool结构类型提供了一个实现operator true和operator false的类型的示例。

以下是true运算符声明的代码段(可能会完成您在问题中想要执行的操作):

public static bool operator true(MyType myInstance)
{
    return myInstance != null;
}

如果您实施true运算符,那么您也必须实现false运算符。

答案 2 :(得分:15)

您的问题的正确答案可以在C#3.0规范的第7.19节中找到,您可以在互联网上轻松找到它。为方便起见,相关文字为:

  

7.19布尔表达式

     

布尔表达式是一个表达式   产生bool类型的结果。

     

控制条件表达式   一个if语句[...]是一个   布尔表达式。 [...]

     

需要布尔表达式   一种可以隐含的类型   转换为bool或类型的bool   实现operator true。如果没有   满足要求,a   发生编译时错误。

     

当布尔表达式是一个类型时   无法隐式转换为   bool但确实实现了operator true,   然后进行评估   表达式,运算符为true   该类型提供的实现   被调用以产生bool值。

除了bool本身之外没有其他类型可以通过内置转换隐式转换为bool,但当然,用户可以定义用户定义的bool隐式转换。

答案 3 :(得分:13)

简答:

在C#中:

  • true:永远是真的
  • false:始终为假

其他一切都不是布尔值。

答案 4 :(得分:11)

这样的代码将(并且应该)无法编译。如果您特别想要覆盖该行为,则可以创建implicit conversion到布尔值。像这样:

public class Foo {
    public static implicit operator bool(Foo me) {
        if (me == null) {
            return false;
        }

        return true; // maybe add more logic before saying True
    }
}

我认为这是一种不好的做法,因为对于一个不熟悉你的项目的编码人员来说,并不是很清楚什么逻辑提供了布尔转换。更惯用的方法是通过静态辅助函数明确告诉读者您的代码正在做什么,就像内置的String类一样:

if (String.IsNullOrEmpty(str){
    // ...
}

代码只写一次,经常阅读;优化可读性。

答案 5 :(得分:3)

if语句计算可以转换为/等于/返回布尔值的东西,或者布尔本身......检查null就像obj!= null就是这样一个表达式,

'if(obj)'只有在obj能够转换为bool时才能工作,而不是如果它是null。

答案 6 :(得分:3)

之前的答案是正确的。但是,我在一些罕见的情况下使用了扩展方法:

public static bool IsTruthy(this object obj)
{
    if (obj == null || obj is DBNull)
        return false;

    var str = obj as string;
    if (str != null)
        return !string.IsNullOrWhiteSpace(str) && 
            !str.Trim().Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase);

    try
    {
        if (Convert.ToDecimal(obj) == 0)
            return false;
    }
    catch { }

    if (obj is BigInteger)
        return ((BigInteger)obj) != 0; 

    return true;
}

关于此的一些注意事项:

  • 此方法与javascript处理字符串“False”
  • 的方式不一致
  • 对于空的枚举,此方法返回true,这与javascript
  • 一致

答案 7 :(得分:0)

如果obj是您创建的类型,则可以将用户定义的隐式转换定义为bool

答案 8 :(得分:0)

您可以通过扩展方法定义自己的truthy和falsy。

public static bool Falsy(this object obj) {
        if(obj == null) return true;
        if (obj is string)
            if(obj as string == string.Empty) return true;
        if(obj is byte)
            if((byte)obj == 0) return true;
        if(obj is sbyte)
            if((sbyte)obj == 0) return true;
        if(obj is short)
            if((short)obj == 0) return true;
        if(obj is ushort)
            if((ushort)obj == 0) return true;
        if(obj is int)            
            if((int)obj == 0) return true;
        if(obj is uint)
            if((uint)obj == 0) return true;
        if(obj is long)
            if((long)obj == 0) return true;
        if(obj is ulong)
            if((ulong)obj == 0) return true;
        if(obj is float)
            if((float)obj == 0) return true;
        if(obj is double)
            if((double)obj == 0) return true;
        if(obj is decimal)
            if((decimal)obj == 0) return true;
        if(obj is IEnumerable<object>)
            if((obj as IEnumerable<object>).Count<object>() == 0)
                return true;
        if(obj is Array)
            if(((Array)obj).Length <= 0)
                return true;
        if(obj is ObjectId)
            if(((ObjectId)obj).Pid == 0) return true;
        if(obj is System.Collections.ObjectModel.ObservableCollection<M>)
            if(((ObservableCollection<M>)obj).Count <= 0) return true;
                return false;
}

public static bool Truthy(this object obj) {
   return !Falsy(obj);
}

所以你可以这样做:

if(customerList.Falsy()){throw new Exception(&#34;不能为null或为空。&#34;); }

答案 9 :(得分:-5)

C#是一种静态类型的语言,也就是说对象的类型在设置它时很重要。

例如,“4”!= 4。

JavaScript是一种动态类型语言,因此类型不太重要。

所以在JavaScript中,“4”== 4。

“truthy”值是恰好满足x == true的值,而“falsey”值则不是。

如果没有类型安全性,某些功能(如重载)将产生不可预测的行为。

有关详细信息,请参阅here