我有一个自定义WebControl,它实现了一个.Value返回Nullable <decimal> 的getter/setter
它是一个客户端过滤的文本框(TextBox包含javascript 的子类和用于设置/获取值的一些服务器端逻辑)
这是来自该控件的getter和setter:
public decimal? Value
{
get
{
decimal amount = 0;
if (!decimal.TryParse(this.Text, NumberStyles.Currency, null, out amount))
{
return null;
}
else
{
return amount;
}
}
set
{
if (!value.HasValue)
{
this.Text = "";
}
else
{
this.Text = string.Format("${0:#,##0.00}", value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我看到的问题是这个语句的输出:
decimal Amount = uxAmount.Value ?? 0M;
Run Code Online (Sandbox Code Playgroud)
当uxAmount.Value返回10000 时,我看到Amount被设置为"0" .
这符合我的预期(原则是套管的变化):
decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;
Run Code Online (Sandbox Code Playgroud)
我也看到了这种行为(最近)在调用Linq2Sql数据上下文中定义的UDF函数以及空合并运算符时,我知道我的UDF调用返回了预期值,但我得到的是RHS值. …
每个人都知道这不是线程安全的:
public StringBuilder Builder
{
get
{
if (_builder != null)
_builder = new StringBuilder();
return _builder;
}
}
Run Code Online (Sandbox Code Playgroud)
那这个呢?
public StringBuilder Builder
{
get { return _builder ?? (_builder = new StringBuilder()); }
}
Run Code Online (Sandbox Code Playgroud) myFoo = myFoo ?? new Foo();
Run Code Online (Sandbox Code Playgroud)
代替
if (myFoo == null) myFoo = new Foo();
Run Code Online (Sandbox Code Playgroud)
我是否认为第一行代码将始终执行赋值?此外,这是否使用空合并运算符?
我已将Class Person属性Birthday定义为可为空的DateTime?,那么为什么空融合运算符不应该在以下示例中起作用?
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
我得到的编译器错误是"操作员'??' 不能应用于'System.DateTime?'类型的操作数 和'System.DBNull'"
以下也出现了编译错误:
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
(person.Birthday == null) ? person.Birthday:DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
我按照Refactor的建议添加了一个强制转换为(对象),然后编译,但是没有正常工作,并且在两种情况下,值都存储在sqlserver db中为null.
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? (object)DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
有人能解释一下这里发生了什么吗?
我需要使用以下笨拙的代码:
if (person.Birthday == null)
cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value
= DBNull.Value;
else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value =
person.Birthday;
Run Code Online (Sandbox Code Playgroud) 使用Java,为了安全地访问深层嵌套引用
a.b.c.d.e,我们通常必须在每个级别指定空检查或包装Optional并使用orElse().(与Kotlin/C#等语言a?.b?.c?.d?.e或类似作品不同.
我想知道以下帮助方法是否是一个合理的替代方法:
public <T> T valueOrNull(Supplier<T> expression) {
try {
return expression.get();
} catch (NullPointerException e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以安全地使用它value = valueOrNull(() -> a.b.c.d.e).
注意:据我所知,NullPointerException由于性能原因等原因,捕获s通常是不受欢迎的,但是想知道这里的用法是否是一个合理的例外.
我正试着安全地检查一下IList<>是不是空的.
var Foo = Bar.GimmeIListT(); // Returns an IList<SomeObject>
if (Foo?.Any())
// Do cool stuff with items in Foo
Run Code Online (Sandbox Code Playgroud)
但是条件有错误:
不能隐含地转换'bool?' 'bool'.存在显式转换(您是否错过了演员?)
因此,似乎条件评估为可空的布尔,所以我尝试
if (Foo?.Any().Value())
Run Code Online (Sandbox Code Playgroud)
但这也不好:
'bool'不包含'Value'的定义,也没有扩展.... blah blah blah
因此,在第一种情况下,它抱怨它是一个可以为空的布尔,但在第二种情况下,它抱怨它不是.
作为另一种途径,我尝试:
if (Foo?.Any() == true)
Run Code Online (Sandbox Code Playgroud)
这有效 - 但它不应该因为这使用了第一条消息说它不想要的隐式转换!
到底是怎么回事?这样做的正确方法是什么?
将 Visual Studio 2019 与 ReSharper(均为最新版本)一起使用,我无法获得智能感知来停止抱怨 ECMAScript 2020 功能,例如空合并运算符 (??)。
该代码有效,但编辑器认为这是一个错误,这很烦人。这是我看到的:
我尝试在 VS 中将项目的 TypeScript Build ECMAScript 版本设置为 ECMAScript 2020:ReSharper ECMAScript 版本设置为“实验性”。有没有人设法让这个工作?
resharper null-coalescing-operator javascript-intellisense visual-studio-2019
我今天在代码库中遇到了一些单例代码,我不确定以下是否是线程安全的:
public static IContentStructure Sentence{
get {
return _sentence ?? (_sentence = new Sentence());
}
}
Run Code Online (Sandbox Code Playgroud)
该陈述相当于:
if (_sentence != null) {
return _sentence;
}
else {
return (_sentence = new Sentence());
}
Run Code Online (Sandbox Code Playgroud)
我相信 ??只是一个编译器技巧,结果代码仍然不是原子的.换句话说,在将_sentence设置为新句子并返回之前,两个或多个线程可以找到_sentence为null.
为了保证原子性,我们必须锁定那段代码:
public static IContentStructure Sentence{
get {
lock (_sentence) { return _sentence ?? (_sentence = new Sentence()); }
}
}
Run Code Online (Sandbox Code Playgroud)
那一切都正确吗?
当我使用LINQ将XML文件解析为自定义对象时,我试图阻止具有NULL值.
我在Scott Gu的博客上找到了一个很好的解决方案,但由于某些原因它对我的整数不起作用.我想我使用了相同的语法,但似乎我错过了一些东西.哦,由于某种原因,当节点不为空时它可以工作.
下面是我的代码的摘录.
List<GrantAgresso> lsResult = (from g in xml.Element("root").Elements("Elementname")
select new GrantAgresso()
{
Year = (int?)g.Element("yearnode") ?? 0,
Subdomain = (string)g.Element("domainnode") ?? ""
}).ToList();
Run Code Online (Sandbox Code Playgroud)
错误消息是:
输入字符串的格式不正确.
如果有人知道我做错了什么,请帮忙:)
编辑:一块XML(奇怪的名字,但它不是选择)
<Agresso>
<AgressoQE>
<r3dim_value>2012</r3dim_value>
<r0r0r0dim_value>L5</r0r0r0dim_value>
<r7_x0023_province_x0023_69_x0023_V005>0</r7_x0023_province_x0023_69_x0023_V005>
<r7_x0023_postal_code_x0023_68_x0023_V004 />
<r7_x0023_country_x0023_67_x0023_V003>1004</r7_x0023_country_x0023_67_x0023_V003>
<r7_x0023_communitydistrict_x0023_70_x0023_V006>0</r7_x0023_communitydistrict_x0023_70_x0023_V006>
</AgressoQE>
</Agresso>
Run Code Online (Sandbox Code Playgroud) 我正在读回DateTime?从我看来的价值.现在我检查一下NextUpdateDateTime?HasValue如果是这样,将时间转换为UTC.
从阅读起来看来,我似乎需要使用a null coalescing operator但是我的任务告诉我System.NUllable不包含ToUniversalTime()使用该运算符时的定义.
我在SO上搜索了类似的问题,但没有运气.
题:
如何将null DateTime值转换为UTC?
码:
我只是检查DateTime?有一个值,如果是这样,将DateTie转换为UTC -
if (escalation.NextUpdate.HasValue)
{
escalation.NextUpdate = escalation.NextUpdate ?? escalation.NextUpdate.ToUniversalTime();
}
else
{
escalation.NextUpdate = null;
}
Run Code Online (Sandbox Code Playgroud)
我NextUpdate在模型中的属性:
public DateTime? NextUpdate { get; set; }
Run Code Online (Sandbox Code Playgroud) c# model-view-controller datetime nullable null-coalescing-operator