天道酬勤,学无止境

C# 中 switch 的空情况与下一个非空情况相结合吗? [关闭](Is empty case of switch in C# combined with the next non-empty one? [closed])

问题

使用以下代码:

case "GETSITES":
case "SITESETUP":
    MessageBox.Show("Help! I am suffering from the Air-Conditioned Nightmare!!!");
    // ...

MessageBox.Show是否会在开关值为"GETSITES""SITESETUP"

还是当开关值为"SITESETUP"

由于"GETSITES"没有中断,我想是的,但我不确定。


更新

我想我应该将我的问题表述为:

这两个代码片段在语义上是等价的吗?

  • 片段1

     case 0: case 1: // bla bla bla; break;
  • 片段2(伪代码)

     case 0, 1: // bla bla bla; break;
回答1

您所描述的是同一案例有两个标签。 C# 确实允许这样做。 但是,您不能以 C 允许的相同方式跳到下一个 case 语句,也就是说,您的标签不能有一些代码,然后跳到下一个 case 语句。 这是被禁止的,会导致编译错误。

回答2

C# 中的空 case 语句是否与下一个非空语句组合?

我原先说:

这个问题假设是假的。 在合法的 C# 程序中不存在空的 switch 部分。

这并不完全正确。 C#规范要求 switch 部分至少包含一个语句,但实现实际上并不包含。

我修改我的声明如下:

问题假设有一个空的 switch 部分(注意 switch 部分不是statements ),但在非常不寻常的情况下只能有一个空的 switch 部分。 首先,让我们清楚地描述 switch 语句的结构。

当你有:

switch(x) 
{ 
   case 1: 
   case 2: 
       Console.WriteLine("Hello");
       break;
}

只有一个开关部分。 案例1之后没有“空白部分”; 一个部分由所有case 子句后跟零个或多个语句组成。 (规范需要一个或多个语句,但实现实际上允许零个语句。)语句列表必须有一个不可访问的端点。

存在一个在 switch 部分内无法到达终点的空语句列表的唯一方法是使 switch 部分本身无法到达。 有两种方式可能发生。 要么整个​​交换机不可达,要么交换机开启一个常数。 简而言之,制作空开关部分的唯一方法是:

switch(1) { case 2: }

或者

if (false) switch(x) { case 2: }

根据规范,两者都不合法,但 C# 编译器允许两者。 幸运的是,这是一个非常无害的错误。

在这两种情况下,段的终点都不可达,因此空段是可达的。 但是,案例之间永远不会有空白部分。

回答3

根据测试,您可以执行以下操作:

switch(i)
{
    case 0:
    case 1:
    case 2:
        doSomething();
        break;
    default:
        doNothing();
        break;
}

但你不能:

switch(i)
{
   case 0:
      doSomething();
   case 1:
      doSomethingElse();
      break;
   default:
      doNothing();
      break;
}

所以,答案是,是的,您可以将多个案例堆叠在一起,但您不能让控制从一个案例运行到另一个案例。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 什么是语句的不可达端点(unreachable endpoint)?(What is a non-reachable end point(unreachable endpoint) of a statement?)
    问题 灵感来自这个问题的答案 C# 中 switch 的空情况是否与下一个非空情况相结合? 此术语的唯一出现出现在 C# 语言规范的 §6.5 中 如果D有一个非 void 返回类型并且F的主体是一个语句块,当F每个参数被赋予D对应参数的类型时, F的主体是一个有效的语句块(wrt §8.2)一个不可到达的端点,其中每个 return 语句指定一个表达式,该表达式可隐式转换为D的返回类型。 在规范的后面我们可以看到 8.1 端点和可达性每个语句都有一个结束点。 直观地说,语句的结束点是紧跟在语句之后的位置。 复合语句(包含嵌入语句的语句)的执行规则指定了当控制到达嵌入语句的终点时所采取的动作。 例如,当控制到达块中语句的终点时,控制转移到块中的下一条语句。 ... 我们可能对此有所了解。 但是,我用谷歌搜索,发现没有对non-reachable endpoint的直接解释。 因为 Stack Overflow 是一个问答网站,我想如果有一个更简单、更直观的解释,可以很容易地搜索和理解这个术语对程序员尤其是非英语母语的程序员会有帮助。 回答1 Ben 的回答很好地说明了这一点。 更准确地说,终点是: 休息继续去返回扔 声明无法访问。 这些语句中的每一个都在“结束之前”将控制权转移到其他地方,因此永远不会命中语句的“终点”。 将其与以下语句进行比较: Console.WriteLine
  • Clojure:休息与下一个(Clojure: rest vs. next)
    问题 我很难理解 Clojure 中rest和next之间的区别。 官方网站关于懒惰的页面表明偏好可能应该是使用rest ,但它并没有真正清楚地解释两者之间的区别。 有人可以提供一些见解吗? 回答1 正如您链接的页面所描述的, next比(的新行为) rest更严格,因为它需要评估惰性 cons 的结构以知道是返回nil还是 seq。 另一方面, rest总是返回一个 seq,因此在您实际使用rest的结果之前,不需要评估任何内容。 换句话说, rest比next更懒惰。 回答2 如果你有这个,这很容易: (next '(1)) => nil 所以next看下一件事情,如果该行是空的,它会返回nil而不是空的 seq。 这意味着它需要向前看(到它将返回的第一个项目),这使得它不是完全懒惰的(也许你不需要下一个值,但next浪费了计算时间来向前看)。 (rest '(1)) => () rest不向前看,只返回 seq 的其余部分。 也许你会想,为什么还要在这里使用两种不同的东西? 原因是您通常想知道 seq 中是否没有任何剩余内容并只返回nil ,但在某些情况下,性能非常重要并且评估一个更多项目可能意味着您可以使用rest付出巨大的努力。 回答3 next就像(seq (rest ...)) 。 rest将返回序列的剩余部分。 如果序列的那一部分尚未实现,则rest不会强制它。
  • 非空函数中的空返回,是未定义的行为吗?(Empty return in non-void function, is undefined behaviour?)
    问题 在阅读了有关控制主题的答案到达非空函数的结尾后,我没有看到任何答案专门针对使用空return语句退出非空函数的情况: int return_integer() { return; } // empty return in non-void function 到目前为止,我在 C 标准中发现的是: 6.8.6.4 返回语句约束带有表达式的return语句不应出现在返回类型为void的函数中。 没有表达式的return语句只能出现在返回类型为void的函数中。 标准引用说明了我们应该如何处理void和非void函数的return语句,当我们忽略约束时会发生什么在文档的其他部分中提到: 6.9.1 函数定义如果到达终止函数的} ,并且调用者使用了函数调用的值,则行为未定义。 先前的标准引用指出,如果我们使用在到达右花括号 ( } ) 后结束的函数的返回值,就会发生 UB,因此我们在下面的代码中使用了 UB: int UB(int x) { if (x) return x; } printf("%d", UB(1)); // Correct printf("%d", UB(0)); // Undefined behavior 在UB(1)调用中,函数通过return x;返回1 return x; if (x)下的指令; 在UB(0)调用中, if (x)条件未通过,因此函数结束到达
  • 我可以使用反射更改C#中的私有只读字段吗?(Can I change a private readonly field in C# using reflection?)
    问题 我想知道,由于使用反射可以完成很多事情,构造函数完成执行后是否可以更改私有只读字段? (注意:只是好奇心) public class Foo { private readonly int bar; public Foo(int num) { bar = num; } public int GetBar() { return bar; } } Foo foo = new Foo(123); Console.WriteLine(foo.GetBar()); // display 123 // reflection code here... Console.WriteLine(foo.GetBar()); // display 456 回答1 你可以: typeof(Foo) .GetField("bar",BindingFlags.Instance|BindingFlags.NonPublic) .SetValue(foo,567); 回答2 显而易见的是尝试一下: using System; using System.Reflection; public class Test { private readonly string foo = "Foo"; public static void Main() { Test test = new Test(); FieldInfo
  • C#6中的空条件运算符和字符串插值(Null-conditional operator and string interpolation in C# 6)
    问题 空条件运算符和插值字符串的语法是否可以解析为仅语法糖? 空条件运算符( ?. ),它允许通过减少“过多”的null检查和插入字符串( ("\{X}, \{Y}") )来清理代码,从而将参数和格式引入一是C#6的新功能。 是否将这些代码编译为不受欢迎的代码(即我们试图避免的丑陋代码)? 对于这个天真的问题,我深表歉意,但我一般对语言没有最好的了解,但是我很好奇是否可以在C#5上运行这些功能。 我知道在某些情况下Java就是这种情况,这些示例也是如此吗? 回答1 没有一般规则,这是不同的。 有些功能只是语法糖,有些是以前无法实现的功能,有些是两者的结合。 句法糖 字符串插值-此: string result = $"{bar}"; 代替: string result = string.Format("{0}", bar); 空传播运算符( ?. )-此: var result = Foo()?.Length 代替: var temp = Foo(); var result = (temp != null) ? temp.Length : null; 新功能 字符串插值-还使用FormattedString添加了对IFormattable支持,因此可以实现: IFormattable result = $"{bar}" 在catch / finally中等待
  • C# 8.0 正式发布:Visual Studio 2019 支持所有新功能
    微软宣布 C# 8.0 作为 .NET Core 3.0 版本的一部分正式可用,该消息同步发布于.NET Conf 2019 及其开发博客中。新的语言功能包括可为空的引用类型、异步流、默认接口成员及新的代码模式。Visual Studio 2019 支持所有的新功能。可为空的引用类型是新版本中最重要的功能之一。它旨在通过使用特定语法规则来防止与空引用异常相关的场景,这个语法规则是:开发人员必须明确表示某个变量是否可以采用 null 值。在这种情况下,变量声明中的类型名必须附加“?”(类似可为空的值类型):string? foo;如果该变量的类型名后面没有附加“?”,那么,它被视为一个不可为空的引用类型。在这种情况下,编译器将强制实行不可为空的规则:该变量必须被初始化为一个非空值,并且该变量永远不能被赋予空值。可以(在大多数情况下不推荐)用变量名后面附加空宽容操作符“!”来覆盖这个行为:foo!.Length;还可以使用可为空上下文来控制是否给出可空警告,或者可为空的注解是否有影响。可以在项目级别或在带有 #nullable 和 #pragmawarning 预处理指令的源代码文件中指定可为空上下文。另外,一个类型可以具备的可为空行为是如下四种之一:无视(Oblivious),不可为空(nonnullable),可为空(nullable),未知(unknown)
  • 制作一行高度的空div(Make empty div of one line height)
    问题 是否可以创建一个规则来生成以下 HTML: <div style="width: 100%"></div> 仅使用 CSS 的一行高度,或者我是否需要放置  作为内容? 回答1 一些可能性: 将高度(或最小高度)设置为行高的使用值。 line-height的初始值是normal ,其使用值取决于实现,但规范建议使用1.0和1.2之间的数字在我的情况下(对于带有font-family: "times new roman" winXP 的 FF27 )该值为1.25 ,因此您可以使用height: 1.25em 。 但是,该值可能与其他字体或实现不同。 然后,最好手动将line-height设置为某个值,例如line-height: 1.25em 。 div { border: 1px solid red; min-height: 1.25em; line-height: 1.25; } <div></div> 请注意,如果您只想在没有内容时将这些样式设置为元素,则可以使用 :empty 伪类: div:empty { border: 1px solid red; height: 1.25em; line-height: 1.25; } <div></div> 向元素插入一些内容。 例如,您可以添加一个普通空格并将 white-space 设置为pre-wrap (或pre
  • 为什么从非空函数的末尾流出而不返回值不会产生编译器错误?(Why does flowing off the end of a non-void function without returning a value not produce a compiler error?)
    问题 自从我多年前意识到,这默认情况下不会产生错误(至少在GCC中),我一直想知道为什么? 我知道您可以发出编译器标志来产生警告,但是它不总是错误吗? 对于非void函数不返回有效值,为什么有意义? 注释中要求的示例: #include <stdio.h> int stringSize() { } int main() { char cstring[5]; printf( "the last char is: %c\n", cstring[stringSize()-1] ); return 0; } ...编译。 回答1 C99和C ++标准不需要函数来返回值。 仅在main函数中定义返回值的函数中缺少的return语句(返回0 )。 基本原理包括检查每个代码路径是否返回值是非常困难的,并且可以使用嵌入式汇编器或其他棘手的方法来设置返回值。 从C ++ 11草案中: §6.6.3 / 2 从函数末尾流出会导致值返回函数发生不确定的行为。 §3.6.1 / 5 如果控制在没有遇到return语句的情况下到达了main的末尾,则其效果是执行return 0; 请注意,C ++ 6.6.3 / 2中描述的行为在C中是不同的。 如果使用-Wreturn-type选项调用gcc,它将发出警告。 -Wreturn-type每当使用默认为int的return-type定义函数时发出警告。
  • 如果没有NULL,我们会做什么?(What would we do without NULL?)
    问题 我曾经读到拥有可空类型是绝对邪恶的。 我相信这是在创建它们的人(在 Ada 中?)写的一篇文章中我相信这是这篇文章 无论如何,如果默认情况下像 C# 这样的语言使用不可空类型怎么办? 您将如何替换 C# 或 Ruby 或任何其他常见语言中的一些常见习语,其中null是可接受的值? 回答1 我不会直接声明可空类型是邪恶的,而是假设:大多数语言将可空性移植到整个类型上,而这两个概念实际上应该是正交的。 例如,所有非原始 Java 类型(和所有 C# 引用类型)都是可为空的。 为什么? 我们可以来回走动,但最终我敢打赌答案归结为“这很容易”。 Java 语言没有任何内在要求广泛的可空性。 C++ 引用提供了一个很好的示例,说明如何在编译器级别消除空值。 当然,C++ 有很多更丑陋的语法,Java 试图明确地削减这些语法,所以一些好的特性最终与坏的一起被淘汰。 C# 2.0 中的可空值类型提供了朝着正确方向迈出的一步——将可空性与不相关的类型语义,或者更糟的是,CLR 实现细节解耦——但它仍然缺少对引用类型执行相反操作的方法。 (代码契约很棒,但它们并没有像我们在这里讨论的那样嵌入到类型系统中。) 许多函数式或其他晦涩的语言从一开始就“直接”理解了这些概念……但如果它们被广泛使用,我们就不会进行这个讨论…… 回答您的问题:从现代语言中全面禁止空值与所谓的“数十亿美元的错误”一样愚蠢。
  • 关系数据库中的空值可以吗? [关闭](Are nulls in a relational database okay? [closed])
    问题 关门了。 这个问题需要细节或明确性。 它当前不接受答案。 想要改善这个问题吗? 添加详细信息,并通过编辑此帖子来澄清问题。 5个月前关闭。 改善这个问题 有一种流派认为在关系数据库中不应该允许空值。 也就是说,表的属性(列)不应允许空值。 来自软件开发背景,我真的不明白这一点。 似乎如果null在属性的上下文中有效,则应允许该值。 这在Java中非常普遍,在Java中,对象引用通常为null。 没有丰富的数据库经验,我想知道我是否在这里缺少什么。 回答1 从数据库规范化的角度看,空值是负面的。 这样的想法是,如果值不能为空,那么您实际上应该将其拆分为另一个稀疏表,这样就不需要没有值的项目的行。 这是确保所有数据有效且有价值的一种努力。 不过,在某些情况下,使用null字段很有用,尤其是在出于性能原因而希望避免再进行联接的情况下(尽管数据库引擎的安装正确,这不应该成为问题,除非在特殊的高性能情况下。) -亚当 回答2 反对null的一种说法是它们没有明确定义。 如果字段为空,则可以解释为以下任何一种: 值为“ Nothing”或“ Empty set” 没有任何值对该领域有意义。 该值未知。 该值尚未输入。 该值是一个空字符串(对于不区分null和空字符串的数据库)。 某些特定于应用程序的含义(例如,“如果该值为null,则使用默认值。”) 发生错误
  • 什么是TypeScript?为什么我要用它代替JavaScript? [关闭](What is TypeScript and why would I use it in place of JavaScript? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 4年前关闭。 改善这个问题 您能描述一下TypeScript语言是什么吗? JavaScript或可用的库无法执行的工作是什么,这使我有理由考虑它? 回答1 我最初是在TypeScript仍然热销时写这个答案的。 五年后,这是一个不错的概述,但请查看下面的Lodewijk的答案以更深入地了解 1000英尺查看... TypeScript是JavaScript的超集,主要提供可选的静态类型,类和接口。 最大的好处之一就是使IDE能够提供一个更丰富的环境,以便您在键入代码时发现常见错误。 要了解我的意思,请观看有关该语言的Microsoft入门视频。 对于大型JavaScript项目,采用TypeScript可能会导致软件更强大,同时仍可以在运行常规JavaScript应用程序的地方进行部署。 它是开源的,但是如果您使用受支持的IDE,则只有在键入时才获得聪明的Intellisense。 最初,这只是Microsoft的Visual Studio(也在Miguel de Icaza的博客文章中提到)。 如今,其他IDE也提供TypeScript支持。 还有其他类似的技术吗? 有CoffeeScript,但这确实有不同的用途。 恕我直¨
  • 返回空的不良设计吗? [关闭](Is returning null bad design? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 我听到一些声音说,从方法中检查返回的空值是错误的设计。 我想听到一些原因。 伪代码: variable x = object.method() if (x is null) do something 回答1 不返回null的基本原理是您不必检查它,因此您的代码无需根据返回值遵循其他路径。 您可能想查看Null对象模式,它提供了有关此信息的更多信息。 例如,如果我要用Java定义一个返回Collection的方法,那么我通常更喜欢返回一个空的collection(即Collections.emptyList() )而不是null,因为这意味着我的客户端代码更干净了。 例如 Collection<? extends Item> c = getItems(); // Will never return null. for (Item item : c) { // Will not enter the loop if c is empty. // Process item. } ...比以下更清洁: Collection<? extends Item> c = getItems(); // Could potentially
  • x is null 和 ReferenceEquals(x, null) 之间有区别吗?(Is there a difference between x is null and ReferenceEquals(x, null)?)
    问题 当我写这个: ReferenceEquals(x, null) Visual Studio 建议将 可以简化空检查。 并将其简化为 x is null 那些真的一样吗? 回答1 在这种情况下,它们的含义相同,是的。 不过,大多数人会使用x == null 。 我猜ReferenceEquals可能有点混乱,因为实际上null是一个文字,意味着根本没有引用。 任何参考怎么可能等于没有参考? 请注意, x is null仅允许用于 C#7 及其模式匹配功能。 通常您使用is检查x是否是兼容类型但null不是类型。 所以这也有点混乱。 这就是为什么我更喜欢x == null 回答2 我注意到很多答案指定x == null 、 x is null和ReferenceEquals(x, null)都是等价的 - 在大多数情况下这是真的。 但是,有一种情况您不能使用x == null正如我在下面记录的那样: 请注意,下面的代码假设您已经为您的类实现了 Equals 方法: 不要这样做 - operator == 方法将被递归调用,直到发生堆栈溢出: public static bool operator ==(MyClass x1, MyClass x2) { if (x1 == null) return x2 == null; return x1.Equals(x2) } 改为这样做:
  • PSQLException:错误:列中的空值违反了非空约束(PSQLException: ERROR: null value in column violates not-null constraint)
    问题 我在 64 位 Debian 4.4.5-8 上的 x86_64-pc-linux-gnu 上使用 PostgreSQL 8.4.13。 我创建了下表: CREATE TABLE users ( user_id serial PRIMARY KEY NOT NULL, name varchar(200), username varchar(150), password varchar(150), ); 然后,使用 Java 应用程序,我执行以下代码: String insertTableSQL = "INSERT INTO USERS" + "(name, username, password) VALUES" + "(?,?,?)"; PreparedStatement preparedStatement = DBCon.prepareStatement(insertTableSQL); preparedStatement.setString(1, userInfo.get("name")); preparedStatement.setString(2, userInfo.get("username")); preparedStatement.setString(3, userInfo.get("password"))); preparedStatement
  • 如果我们不从c ++中的非空返回类型函数返回任何内容,返回值是多少?[实验] [重复](What is the return value if we dont return anything from a non void return typed function in c++?[Experimental] [duplicate])
    问题 这个问题已经在这里有了答案: 为什么从非空函数的末尾流出而不返回值不会产生编译器错误? (9个答案) 7年前关闭。 我观察到,如果我不从具有int返回类型为1的空函数返回任何值。 但是在以下情况下,它将4 3 2显示为o / p(这是在此处打印静态变量si的值吗?如果我打印si我将得到o / p为2 3 4,这与我相反立即获取。在这种情况下,该函数的堆栈推入和弹出与这里有关吗? 我还观察到,如果我使用float作为返回类型,那么它将nan nan nan打印为o / p。 此行为是否与编译器相关(我曾尝试使用gcc和devcpp,观察到的情况相同)? 这到底是怎么回事? 请分享您对此的想法。 #include<iostream> using namespace std; int f(int i){ static int si = i; si = si + i; ///return si; } int main(){ cout<<f(1)<<" "<<f(1)<<" "<<f(1); //cout<<" "<<f(1); //if I uncomment this line then the o/p is: 4 3 2 5, it looks like it's printing the value of si. } 看起来cout的行为导致静态变量si的值反向打印? 回答1
  • JavaScript中的每个函数是否都是闭合符,这是真的吗?(Is it true that every function in JavaScript is a closure?)
    问题 我知道JavaScript中的每个函数都是一类对象,并且具有内部属性[[scope]],该属性承载该函数的自由变量的绑定记录。 但是,有两种特殊情况。 由Function构造函数创建的函数也是闭包吗? 由函数构造函数创建的函数对象是特殊的,因为其[[scope]]可能不引用其外部函数的词法环境,而仅引用全局上下文。 例如, var a = 1; var fn = (function outer() { var a = 2; var inner = new Function('alert(a); '); return inner; })(); fn(); // will alert 1, not 2. 这是不直观的。 这也称为关闭吗? 如果内部函数没有任何自由变量,可以说创建内部函数时形成了闭包吗? 例如, // This is a useless case only for academic study var fn = (function outer() { var localVar1 = 1, localVar2 = 2; return function() {}; })(); 在这种情况下,fn引用一个作为内部函数创建的空函数对象。 它没有自由变量。 在这种情况下,我们可以说形成了闭包吗? 回答1 由Function构造函数创建的函数也是闭包吗? 是的,它关闭了全球范围
  • 非空终止 C 风格的字符串(Not null-terminating a C-style string)
    问题 给定一个字符串,比如说, char *str = "Hello,StackOverflow!" char newStr[30]; int l = strlen(str); for(int i =0 ; i<l ; i ++ ) newStr[i] = str[i]; printf("%s" , newStr); 现在,我们知道 c 字符串的最后一个字符必须是'\0' ,因为在这里我们没有明确地做同样的事情(将 '\0' 存储在字符串 newStr 的最后一个索引处),这个程序应该崩溃,因为printf 不会找到字符串的结尾。 但我注意到它有时工作正常,有时则不然。 可能是什么问题呢 ? 实际上几乎每次都在工作。 它不应该崩溃或给出一些运行时错误吗? 在 C++ 中也是同样的情况吗? 回答1 不。它会调用未定义的行为——这意味着它不必崩溃——它实际上可以做任何事情,比如鼻恶魔。 此外,“给出运行时错误” - 好吧,这取决于您所说的运行时错误是什么意思。 C 没有动态运行时——如果您期望从异常中得到格式良好的错误消息,那不会发生。 会发生的情况很可能是分段错误。 总而言之,如果一个人导致/使用未定义的行为,他不能依赖它崩溃或不崩溃。 回答2 不能保证“崩溃”。 一个程序不正确地处理字符串中的空终止符 - 更常见的是访问缓冲区边界之外的数据 - 或违反printf格式字符串
  • 是否有理由在 c# 中使用 clausule 在多个内部检查 null?(Is there a reason to check for null inside multiple using clausule in c#?)
    问题 是否有理由在最后一次使用时检查 null? 在我看来,它很可能不需要? using (var connection = new SqlConnection(connectionString)) { using (var command = new SqlCommand(commandString, connection)) { using (var reader = command.ExecuteReader()) { if (reader != null) { // Use the reader } } } } 编辑: 如果我像这样使用它,我应该在 using 中关闭 reader.Close() 和 connection.Close() 吗: using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) { while (sqlWrite.Read()) { //something to do. } sqlWrite.Close(); varConnection.Close(); } public static
  • 在Java中避免NullPointerException(Avoiding NullPointerException in Java)
    问题 我经常使用object != null来避免NullPointerException。 有什么替代方法: if (someobject != null) { someobject.doCalc(); } 回答1 在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null。 另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值。 换句话说,在两种情况下会出现空检查: 如果为null,则表示合同中的有效回复; 和如果不是有效的回应。 (2)容易。 使用assert语句(断言)或允许失败(例如NullPointerException)。 断言是1.4中新增的一个未被充分利用的Java功能。 语法为: assert <condition> 或者 assert <condition> : <object> 其中, <condition>是布尔表达式, <object>是一个对象,其toString()方法的输出将包含在错误中。 如果条件不成立,则assert语句将引发Error ( AssertionError )。 默认情况下,Java会忽略断言。 您可以通过将选项-ea传递给JVM来启用断言。 您可以启用和禁用单个类和程序包的断言。
  • C# Nullable 类型的编码实践 [关闭](Coding practices for C# Nullable type [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 7年前关闭。 改进这个问题 我从未在我的 C# 代码中使用可空类型。 现在我决定通过在我的代码中引入可空类型来改变我的编码习惯。 在应用程序编程的情况下,从正常数据类型转换为可为空数据类型时,编码实践中应该进行哪些主要更改? 应该注意哪些方面? 我应该时刻注意哪些要点? 回答1 Nullable<T> 在您需要值类型的可能无效状态时,或者正在从可能包含列的null值的数据库中检索数据时非常有用。 在我移植到 C# 的一些旧的 FORTRAN 代码中,无效值为负或 0 是很常见的,但这很麻烦,尤其是当这些值用于数学函数时。 使用Nullable<T>来显示可能的无效状态要明确得多。 值得一提的是,以下是相同的: Nullable<int> myNullableInt; int? myNullableInt; 回答2 不要使用可为空类型,因为它们是您发现的“很酷的新事物”。 在它们适用且真正有用的地方使用它们。 使用它们会产生开销,如果使用不当,它们将不必要地增加代码的复杂性。 您还必须小心避免空引用,因此它们会给使用该代码的程序员带来额外的负担。 (在某些情况下,这比解决方法的成本更可取!) 回答3 此外,我发现以下属性很有用: public bool