C# 初始化s string s = string.empty;

C# 初始化s string s = string.empty;,c#,C#,或 或者,您可以在switch语句中添加默认大小写,以确保s已初始化: default: s = string.Empty; //or some default sql query break; 更好的结构如下: 将try/catch从第二级using语句中取出,并将这两个using语句包装在try/catch块中,换句话说,使您的try/catch成为父级。这并没有错,现在出现了try/catch块,只是您没有专门使用它来捕获SqlCommand异常本身,而是捕获任何异常并在

或者,您可以在switch语句中添加默认大小写,以确保
s
已初始化:

default:
    s = string.Empty; //or some default sql query
    break;
更好的结构如下:

try/catch
从第二级
using
语句中取出,并将这两个
using
语句包装在
try/catch
块中,换句话说,使您的
try/catch
成为父级。这并没有错,现在出现了
try/catch
块,只是您没有专门使用它来捕获
SqlCommand
异常本身,而是捕获任何
异常
并在HTTP响应中返回其错误消息。因此,使用using语句将
try/catch
设为最外层的块

try
{
    StringBuilder sb = new StringBuilder();
    //use sb to build the SQL string query

   using (SqlConnection conn = CreateSqlConnection(connString))
    {
       using (SqlCommand command = CreateSqlCommand(sb.ToString(), conn)
       {
           //open connection + execute command 
       }
    }

{
catch(Exception ex) 
{
}
为什么使用StringBuilder而不是连接字符串变量? 因为C#string是不可变的,这意味着每次连接到该字符串时,C#都必须创建该字符串的副本。StringBuilder是一个快速、可变的字符串对象,可以更快地构建sql字符串

您不需要
StreamReader
,您甚至没有在任何地方使用
sr
,并且在
StreamReader
中使用
语句对
语句中的代码没有任何作用


请注意@LukeBriggs在其回答中提到的安全问题,如果您使用存储过程传递参数或实体框架,您可以减轻Sql注入攻击,但我会说,由于您刚刚学习,安全方面可能有点难以承受,在实际构建人们将使用的软件之前,您不必担心任何安全问题。您的软件必须“在雷达上”,以担心安全漏洞,这是您现在可以看到的一种方式,这样您就可以继续学习而不会不知所措。

安全注意:关于二次检查,您的代码也容易受到数据库注入的影响。你也必须这样做

您的范围界定概念似乎是正确的;您实际看到的错误大概如下所示:

错误CS0165:使用未分配的局部变量's'

这是因为您有使用
s
的代码流,其中没有设置任何值。比较一下:

string s; // No value declared just yet; only the type

if(u == "specificstring"){
   s="Something";
}
当u不是
specificstring
时应该是什么?它没有定义。这就是触发上述错误的原因-在您的情况下,特别是当
sCmd
不是交换机中的两个选项时。您可能知道它不可能是其他任何东西,但编译器不知道。将其与此进行比较:

string s=null; // A null value has been defined no matter what

if(u == "specificstring"){
   s="Something";
}
在这种情况下,当u不是specificstring时,s是null,这很好。同样,这也适用于:

string s; // A null value has been defined no matter what

if(u == "specificstring"){
    s="Something";
}else{
    s=null;
}

但是您的代码有多个可能未定义s的情况,因此将其设置为null(或那些未指定情况下的其他值)会更容易。

安全注意:在二次检查时,您的代码也容易受到数据库注入的影响。你也必须这样做

您的范围界定概念似乎是正确的;您实际看到的错误大概如下所示:

错误CS0165:使用未分配的局部变量's'

这是因为您有使用
s
的代码流,其中没有设置任何值。比较一下:

string s; // No value declared just yet; only the type

if(u == "specificstring"){
   s="Something";
}
当u不是
specificstring
时应该是什么?它没有定义。这就是触发上述错误的原因-在您的情况下,特别是当
sCmd
不是交换机中的两个选项时。您可能知道它不可能是其他任何东西,但编译器不知道。将其与此进行比较:

string s=null; // A null value has been defined no matter what

if(u == "specificstring"){
   s="Something";
}
在这种情况下,当u不是specificstring时,s是null,这很好。同样,这也适用于:

string s; // A null value has been defined no matter what

if(u == "specificstring"){
    s="Something";
}else{
    s=null;
}

但是您的代码有多种情况下s可能是未定义的,因此将其设置为null(或者对于那些未指定的情况设置为其他值)会更容易。

看起来应该像
string s=null而不是
字符串s
(您看到的错误可能是因为变量未定义)看起来应该像
string s=null一样简单而不是
字符串s
(您看到的错误可能是因为变量未定义)s被声明为高于try/catch块的级别,因此这不会起作用-他实际看到的错误可能是“使用未分配的局部变量”,这使他怀疑自己的作用域…因为您现在正在复制我的答案,您还应复制安全通知:P@LukeBriggs哦,在安全通知上写得很好!不,我不想复制你的答案,他在这两方面都有很好的信息,我在控制台应用程序中仔细检查了try/catch未赋值局部变量的使用情况,当然,您是正确的:)s被声明为高于try/catch块的级别,因此这不会起作用-他实际看到的错误可能是“使用未分配的局部变量”,这使他怀疑自己的作用域…因为您现在正在复制我的答案,您还应复制安全通知:P@LukeBriggs哦,在安全通知上写得很好!不,我不想复制你的答案,他在这两方面都有很好的信息,我在控制台应用程序中仔细检查了try/catch未赋值局部变量的使用情况,你当然是正确的:)