boolean(bool)不能为null.和:
bool foo; if(foo){} // Use of unassigned local variable 'foo'
Run Code Online (Sandbox Code Playgroud)
为什么默认值不是假的?那么如果它不是null,它的值是多少?是什么原因?
编辑1 - 默认值确实为false - 但是应该初始化所有变量,为什么?这是另一个问题;)
编辑2 - 与Resharper:private bool foo = false; // Initializing field by default value is redundant???
我熟悉C#规范,第5.3节,它说在使用之前必须分配一个变量.
在C和非托管C++中,这是有道理的,因为堆栈没有被清除,并且用于指针的内存位置可能在任何地方(导致难以追踪错误).
但我的印象是运行时不允许真正的"未分配"值.特别是未初始化的引用类型将始终具有空值,而不是先前调用方法或随机值所遗留的值.
这是正确的,还是我错误地假设这些年来检查null是否足够?你可以在C#中使用非真实的变量,或者CLR是否会处理这个变量并且总是设置了一些值.
使用这样的一段代码,编译器抱怨c.MyProperty:
MyClass c;
try { throw new Exception(); }
catch (Exception) { }
c.MyProperty = 2; // "Use of unassigned local variable 'c'".
Run Code Online (Sandbox Code Playgroud)
然而,如果你指定一个不抱怨null到c在初始化:
MyClass c = null;
try { throw new Exception(); }
catch (Exception) { }
c.MyProperty = 2; // no complains this time.
Run Code Online (Sandbox Code Playgroud)
那么,为什么这有效呢?如果c未分配a null并且编译器假设允许它,则不会抛出相同的异常c.MyProperty,Object引用未设置为对象的实例?
我一直收到annualRate,monthlyCharge和lateFee的错误.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab_5___Danny_Curro
{
class Program
{
static void Main(string[] args)
{
string firstName;
string lastName;
int accNumber;
string creditPlan;
double balance;
string status;
Boolean late = false;
double lateFee;
double monthlyCharge;
double annualRate;
double netBalance;
Console.Write("Enter First Name: ");
firstName = Console.ReadLine();
Console.Write("Enter Last Name: ");
lastName = Console.ReadLine();
Console.Write("Enter Account Number: ");
accNumber = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter Credit Card Plan Number[Blank Will Enter Plan 0]: ");
creditPlan = Console.ReadLine();
Console.Write("Enter Balance: …Run Code Online (Sandbox Code Playgroud) 我遇到了一个if语句,用于检查对象是否为空.
我有一个webClient go并从try/catch中的网站中提取JSON字符串.如果它出错,那是因为API中不存在3位数国家,我只是想跳过它.
这是我的代码:
System.Net.WebClient wc = new System.Net.WebClient();
RootObject ro;
try
{
string resp = wc.DownloadString("https://restcountries.eu/rest/v2/alpha/" + Row.Code.ToString());
JavaScriptSerializer js = new JavaScriptSerializer();
ro = js.Deserialize<RootObject>(resp);
}
catch (Exception e)
{ }
if (ro.Region != null)
{
Row.Region = ro.Region;
Row.SubRegion = ro.Subregion;
}
Run Code Online (Sandbox Code Playgroud)
RootObject是一个反序列化的类.这很好用.
但是,我在if语句中遇到"使用未分配的类'ro'时出错.
有人可以帮我解决这个问题吗?ro在if中如预期的那样工作?
我也试过检查一个特定的节点,它仍然挂在'ro'部分.
此外,这是SSIS中的脚本组件.
谢谢
我正在阅读MCTS Self Paced Training Kit(70-536)Edition 2,在第1章我们有以下内容.
如何声明值类型变量要使用类型,必须首先将符号声明为该类型的实例.值类型具有隐式构造函数,因此声明它们会自动实例化类型; 您不必像处理类一样包含New关键字.构造函数为新实例分配一个默认值(通常为null或0),但是您应该始终在声明中显式初始化该变量,如以下代码块所示:
'VB
Dim b As Boolean = False
// C#
bool b = false;
Run Code Online (Sandbox Code Playgroud)
但是,当我编译以下控制台应用程序时,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ch1_70_536
{
class Program
{
static void Main(string[] args)
{
bool b;
Console.WriteLine("The value of b is " + b);
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到编译时错误
"使用未分配的局部变量b"
在勘误表中甚至没有提到它.我做错了还是这本书完全错了?
我正在自己学习C#,并希望得到一些帮助.我想创建一个简单的控制台程序,允许用户输入要加倍的数字.它说resultMain方法中的变量是未分配的,但是,我做错了什么?
using System;
class Program
{
private static void Double(ref int num, ref int result)
{
result = num * 2;
}
private static int readNumber(string question)
{
Console.Write(question);
string ans = Console.ReadLine();
int number = int.Parse(ans);
return number;
}
public static void Main()
{
int num, result;
num = readNumber("Enter an integer to be doubled: ");
Double(ref num, ref result);
Console.WriteLine("The double of {0} is {1}", num, result);
Console.WriteLine("Press enter to exit...");
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码(简化)、一个结构和一个类。
public struct pBook
{
private int testID;
public string request;
public string response;
public Int32 status;
public int test_id
{
get
{
return testID;
}
set
{
testID = value;
}
}
};
public class TestClass
{
public static void Main(string[] args)
{
pBook Book1;
pBook Book2;
Book1.request = "a";
Book2.response = "b";
Book2.status = 201;
Book2.test_id = 0; //this doesn't work, why?
}
}
Run Code Online (Sandbox Code Playgroud)
在声明中
Book2.test_id = 0;
Run Code Online (Sandbox Code Playgroud)
我收到错误
使用未分配的局部变量“Book2”
任何想法如何纠正?
在MSDN上,此代码发布在https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch 我无法理解为什么它会抛出错误:
使用未分配的局部变量'n'.
static void Main()
{
int n;
try
{
// Do not initialize this variable here.
n = 123;
}
catch
{
}
// Error: Use of unassigned local variable 'n'.
Console.Write(n);
}
Run Code Online (Sandbox Code Playgroud) 我有一个我正在调用的方法,我想确保它在继续之前完成.我也有兴趣知道它是否成功完成,所以我正在做以下事情:
async void Foo() {
bool success;
// stuff
await Task.Run(
() => Bar(out success)
);
if (!success) { // this is the line causing the compiler-error
// handle
}
// other stuff
}
void Bar(out bool success);
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误
CS0165使用未分配的局部变量'success'
这不是一个大问题,因为我可以变得可爱并初始化success=false并传递它,ref而不是out看起来像希望的那样.但是,我很好奇async-await(或Task.Run)的复杂性似乎会导致一个不保证的情况out success会被正确分配.
任何启示都表示赞赏!
编辑:
要添加更多上下文,以下块编译并执行正常.
void Caller() {
bool success;
Callee(out success);
if (success) {
// do something
}
}
void Callee();
Run Code Online (Sandbox Code Playgroud)
这是因为out参数在传递之前不需要初始化.有关更多信息,请访问out:https …