C# 为什么在C中为DBBool(三态)实现返回重载运算符时出现新问题#

C# 为什么在C中为DBBool(三态)实现返回重载运算符时出现新问题#,c#,tri-state-logic,C#,Tri State Logic,如果您在返回时查找一些新的重载运算符(逻辑运算符|,&,!)。我相信这是没有必要的,也是一种小小的记忆浪费。DBBool是一个结构,当它被传递到一个方法中时,会生成一个副本,所以没有理由这样做 // Logical negation operator. Returns True if the operand is False, Null // if the operand is Null, or False if the operand is True. public static DBBo

如果您在返回时查找一些新的重载运算符(逻辑运算符
|
&
)。我相信这是没有必要的,也是一种小小的记忆浪费。DBBool是一个结构,当它被传递到一个方法中时,会生成一个副本,所以没有理由这样做

// Logical negation operator. Returns True if the operand is False, Null 
// if the operand is Null, or False if the operand is True. 
public static DBBool operator !(DBBool x)
{
    return new DBBool(-x.value);
}
// Logical AND operator. Returns False if either operand is False, 
// Null if either operand is Null, otherwise True. 
public static DBBool operator &(DBBool x, DBBool y)
{
    return new DBBool(x.value < y.value ? x.value : y.value);
}
// Logical OR operator. Returns True if either operand is True,  
// Null if either operand is Null, otherwise False. 
public static DBBool operator |(DBBool x, DBBool y)
{
    return new DBBool(x.value > y.value ? x.value : y.value);
}
//逻辑求反运算符。如果操作数为False,则返回True;如果为Null,则返回Null
//如果操作数为Null,则为False(如果操作数为True)。
公共静态DBBool操作符!(dbboolx)
{
返回新的DBBool(-x.value);
}
//逻辑与运算符。如果任一操作数为False,则返回False,
//如果任一操作数为Null,则为Null,否则为True。
公共静态DBBool运算符&(DBBool x,DBBool y)
{
返回新的DBBool(x.valuey.value?x.value:y.value);
}
应该是这样的,不需要更新

public static DBBool operator !(DBBool x)
{
    if (x.value > 0) return False;
    if (x.value < 0) return True;
    return Null;
}
public static DBBool operator &(DBBool x, DBBool y)
{
    return x.value < y.value ? x : y;
}
public static DBBool operator |(DBBool x, DBBool y)
{
    return x.value > y.value ? x : y;
}
公共静态DBBool操作符!(dbboolx)
{
如果(x.value>0)返回False;
如果(x.value<0)返回True;
返回Null;
}
公共静态DBBool运算符&(DBBool x,DBBool y)
{
返回x.valuey.value?x:y;
}
  • 它是一个结构,所以“new”实际上意味着“初始化堆栈上的值”——这很便宜,而且与新对象不同
  • 大多数结构是不可变的;我猜这也太过分了;因此,它不能仅仅改变参数值并返回它-它必须用所需的内容初始化一个新值
  • 它是一个结构,所以“new”实际上意味着“初始化堆栈上的值”——这很便宜,而且与新对象不同
  • 大多数结构是不可变的;我猜这也太过分了;因此,它不能仅仅改变参数值并返回它-它必须用所需的内容初始化一个新值

  • 1.同意。2.结构是不可变的,我同意,但我不同意其余的。我可以改变一个字符串参数并返回它。我已经尝试了修改过的代码,它工作正常。@hIpPy:你不能改变字符串,而且字符串也不是结构。真的不清楚您的意思。@hlpPy重新分配参数与改变参数值不同。不,不能对字符串进行变异。从技术上讲,说“结构是不可变的”是错误的:它们几乎总是应该是可变的,但有些(很少)是可变的——这通常会导致大量的混乱。我的意思是说我可以更改方法中的字符串参数并返回它,而字符串是不可变的。没有什么能阻止我那样做。@hlpPy right;但这与问题无关。在这种情况下,新字符串的值需要来自某个地方;这就是“新”所做的:赋予它价值1。同意。2.结构是不可变的,我同意,但我不同意其余的。我可以改变一个字符串参数并返回它。我已经尝试了修改过的代码,它工作正常。@hIpPy:你不能改变字符串,而且字符串也不是结构。真的不清楚您的意思。@hlpPy重新分配参数与改变参数值不同。不,不能对字符串进行变异。从技术上讲,说“结构是不可变的”是错误的:它们几乎总是应该是可变的,但有些(很少)是可变的——这通常会导致大量的混乱。我的意思是说我可以更改方法中的字符串参数并返回它,而字符串是不可变的。没有什么能阻止我那样做。@hlpPy right;但这与问题无关。在这种情况下,新字符串的值需要来自某个地方;这就是“new”所做的:给它一个值为什么你认为任何内存都被浪费了?@JonSkeet:我明白了,new会在堆栈上初始化一个“DBBool”值,并且在方法退出时会回收内存。为什么你认为任何内存都被浪费了?@JonSkeet:我明白了,new将在堆栈上初始化一个“DBBool”值,并在方法退出时回收内存。