【发布时间】:2016-12-22 22:52:49
【问题描述】:
这段代码我看不懂,这里DataSet对象和字符串变量的实现是一样的,但是输出不同。我可以看到字符串变量输出背后的逻辑,但是对于DataSet,我看不懂明白为什么!
class Program
{
static void Main(string[] args)
{
DataSet ds = new DataSet();
FillDS(ds);
PrintDS(ds);
string name = "old";
AssignString(name);
PrintString(name);
}
private static void AssignString(string name)
{
name = "new name";
}
private static void PrintString(string name)
{
Console.WriteLine(name);
}
private static void FillDS(DataSet ds)
{
ds.Tables.Add(new DataTable("tbl1"));
ds.Tables.Add(new DataTable("tbl2"));
}
private static void PrintDS(DataSet ds)
{
foreach (DataTable item in ds.Tables)
{
Console.WriteLine(item.TableName);
}
}
}
//Output:
//tbl1
//tbl2
//old
【问题讨论】:
-
“相同的实现”是什么意思?在
AssignString中,您正在为name参数分配一个新值。在FillDS中,您没有为ds参数分配任何内容。您正在调用更改其内容的方法。你能看出这两个动作不一样吗?如果您在FillDS中分配了ds = new DataSet(),您会发现您作为参数传入的数据集不会发生变化。 -
我可能不会为传递给 AssignString 的参数分配新值,我可以这样做:name.Remove(0, 1);输出:旧
-
它们都是引用类型,为什么对于字符串它不从原始副本中获取副本,而是从数据集中获取副本?顺便说一句,如果我用 int 替换字符串,结果仍然相同
-
阅读documentation for String.Remove。它不会改变字符串,它只是返回一个新字符串。碰巧 String 没有改变它的方法;它们都只是返回不同的新字符串。
-
在
Main函数中尝试此代码:var s = "test"; s.Remove(0,1); Console.WriteLine(s);。你会发现String.Remove()永远不会改变字符串。然后试试这个:var s2 = s.Remove(0,1); Console.WriteLine(s2);你会发现String.Remove()返回一个与原始字符串不同的字符串。但它并没有改变原来的。
标签: c#