c# string[] arrayA返回arrayA[3]中的空值

本文关键字:arrayA 空值 返回 string | 更新日期: 2023-09-27 18:01:54

我的代码中有很多数组,例如;

string[] arrayA = new string[31];

和我需要把值从数组到SQL数据库

SqlCommand commA = new SqlCommand("INSERT INTO dbo.DatabaseA" +
            " (ColumnA) VALUES" +
            " (@ColumnA)", connA);
commA.Parameters.Add("@ColumnA", SqlDbType.NVarChar).Value = arrayA[3];

为什么@ColumnA返回错误'值未提供'或准确地说arrayA[3] = null ?我一直认为unassigned string[]有""作为初始值

如果在SQLCommand之前分配arrayA[3] = "",代码工作得很好。

是否有一种方法来填充所有string[] arrayA""不使用for循环?

c# string[] arrayA返回arrayA[3]中的空值

从提供的代码来看,没有给arrayA[3]赋值,数组只是一个值的容器,并将每个值设置为与default(string)类似的类型的默认值。

现在,由于string引用类型,字符串的默认值是null,但是值类型 int例如将具有默认值0

我们可以很容易地测试它,如。

string[] arrayA = new string[31];
var s = arrayA[3]; //is null as string is a reference type
int[] arrayB = new int[31];
var i = arrayB[3]; //equals 0 as default(int) = 0

现在,正如在注释中指出的,有简单的方法来填充数组和引用的注释指向如何填充/实例化一个c#数组与一个单一的值?

下面的代码片段来自上面的答案

public static void Populate<T>(this T[] arr, T value ) {
  for ( int i = 0; i < arr.Length;i++ ) {
    arr[i] = value;
  }
}

可以通过:

arrayA.Populate("");

所以在调用中:

commA.Parameters.Add("@ColumnA", SqlDbType.NVarChar).Value = arrayA[3];

事实上arrayA[3] = null

编辑上面的代码片段是一个扩展方法(如方法签名中第一个参数上的this关键字所示)。这必须在static class类似于下面。

public static class ArrayExtensions
{
    public static void Populate<T>(this T[] arr, T value)
    {
        for (int i = 0; i < arr.Length; i++)
        {
            arr[i] = value;
        }
    }
}

对于这个问题

是否有一种方法来填充所有字符串[]arraya与"没有使用for循环?

设置数组中所有项的默认值的所有方法都需要某种类型的循环,该循环可能是foreachfor

您还可以创建一个方法,该方法将为您创建一个指定大小和默认值的数组。

public static T[] CreateArray<T>(int capacity, T defaultValue)
{
    var array = new T[capacity];
    array.Populate(defaultValue);
    return array;
}

可以调用为:

var arrayC = ArrayExtensions.CreateArray<string>(31, "");
s = arrayC[3]; //equals ""

然而,这对我来说开始看起来太懒了。

没有为数组分配任何值。如果需要" ",如果没有值,则使用条件运算符。

arrayA[3]==null?"":arrayA[3];

条件运算符