我正在浏览另一个开发人员编写的一些代码,我不确定是什么long?意思:
protected string AccountToLogin(long? id)
{
string loginName = "";
if (id.HasValue)
{
try
{....
Run Code Online (Sandbox Code Playgroud) 我希望在可空列上搜索数据库表.有时我搜索的值本身就是NULL.因为Null等于什么,甚至是NULL,说
where MYCOLUMN=SEARCHVALUE
Run Code Online (Sandbox Code Playgroud)
将失败.现在我不得不诉诸
where ((MYCOLUMN=SEARCHVALUE) OR (MYCOLUMN is NULL and SEARCHVALUE is NULL))
Run Code Online (Sandbox Code Playgroud)
有更简单的说法吗?
(如果重要,我正在使用Oracle)
我正在使用可空类型进行一些测试,并且它没有像我预期的那样工作:
int? testInt = 0;
Type nullableType = typeof(int?);
Assert.AreEqual(nullableType, testInt.GetType()); // not the same type
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
DateTime? test = new DateTime(434523452345);
Assert.IsTrue(test.GetType() == typeof(Nullable)); //FAIL
DateTime? test = new DateTime(434523452345);
Assert.IsTrue(test.GetType() == typeof(Nullable<>)); //STILL FAIL
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么testInt.GetType()返回int,而typeof(int?)返回真正的可空类型?
Java 1.8正在接收Optional类,它允许我们明确说明方法何时可以返回空值并"强制"其使用者isPresent()在使用它之前验证它是否为null().
我看到C#有Nullable,它做了类似的事情,但有基本类型.它似乎用于数据库查询,以区分值何时存在,并且当它不存在时为0并且为空.
但似乎C#的Nullable不适用于对象,仅适用于基本类型,而Java的Optional仅适用于对象而不适用于基本类型.
在C#中是否有Nullable/Optional类,这迫使我们在提取和使用它之前测试对象是否存在?
通常,我可以看到如下代码构造:
if(a == null || b == null || c == null){
//...
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何广泛使用的库(谷歌,阿帕奇等)同时检查多个对象的无效,例如:
if(anyIsNull(a, b, c)){
//...
}
Run Code Online (Sandbox Code Playgroud)
要么
if(allAreNulls(a, b, c)){
//...
}
Run Code Online (Sandbox Code Playgroud)
更新:
让它更具挑战性,并用以下内容替换原始示例:
if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){
//...
}
Run Code Online (Sandbox Code Playgroud)更新2:
我已经为Apache Commons Lang库创建了一个pull请求来修复这个差距:
这些将被纳入commons-lang,版本3.5:
anyNotNull (Object... values)allNotNull (Object... values)我有一个注释的实体@Entity.
如果我负责创建CREATE TABLE脚本,为什么我应该指定@Column( nullable = false )何时可以使用NOT NULL关键字在数据库中创建列?是否有任何示例显示在字段中使用此属性的好处?
例如,当我有一个可以为空的长度时,它们之间是否有任何区别
myNullableLong.HasValue
Run Code Online (Sandbox Code Playgroud)
和
myNullableLong != null
Run Code Online (Sandbox Code Playgroud)
......还是只是'语法糖'?
我的LINQ中有以下代码:
where (tf.Shipped || tf.Ordered || tf.Processed)
Run Code Online (Sandbox Code Playgroud)
请注意,Shipped,Ordered和Processed都是可以为空的布尔字段
我收到以下消息:
运营商|| 不能应用于'bool'类型的操作数?和'布尔?'
不知道如何解决这个问题,他们需要是可以为空的布尔值,我需要使用OR(||).
好吧,对于你们中的一些人来说这可能是显而易见的,但我对这个相当简单的代码所得到的行为感到难过:
public static void Main(string[] args)
{
int? n = 1;
int i = 1;
n = ++n - --i;
Console.WriteLine("Without Nullable<int> n = {0}", n); //outputs n = 2
n = 1;
i = 1;
n = ++n - new Nullable<int>(--i);
Console.WriteLine("With Nullable<int> n = {0}", n); //outputs n = 3
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
我将两个输出都视为相同且等于2但奇怪的是它们不是.有人可以解释原因吗?
编辑:尽管代码生成这个"怪异"的行为固然做作,它看起来像在C#编译器中的错误虽然看似不重要,原因似乎是内联new为詹姆斯最初指出.但行为不仅限于运营.方法调用的行为方式完全相同,也就是说,当它们只应被调用一次时,它们被调用两次.
考虑以下repro:
public static void Main()
{
int? n = 1;
int i = 1;
n = n …Run Code Online (Sandbox Code Playgroud) 如何获得短期约会 System Nullable datetime (datetime ?)
对于ed 12/31/2013 12:00:00- >只应该返回12/31/2013.
我看不到ToShortDateString可用的.