|
|
开朗的咖啡 · 写一段java docker ...· 1 年前 · |
|
|
侠义非凡的苦瓜 · hive字符串类型转timestamp类型问 ...· 2 年前 · |
|
|
大方的柠檬 · sql执行存储过程超时 不抛错-掘金· 2 年前 · |
|
|
无聊的火锅 · 基于timestamp和nonce的防止重放 ...· 2 年前 · |
|
|
大鼻子的柿子 · Hive学习笔记:列转行之collect_l ...· 2 年前 · |
我来自C++背景。这个问题以前曾被问过,但尽管我可能会尝试,但我找不到答案。假设我有:
string[] ArrayOfReallyVeryLongStringNames = new string[500];
ArrayOfReallyVeryLongStringNames[439] = "Hello world!";
我可以创建一个引用上述内容的字符串(这两个字符串都不会编译):
string a = ref ArrayOfReallyVeryLongStringNames[439]; // no compile
string a = &ArrayOfReallyVeryLongStringNames[439]; // no compile
我理解字符串在C#中是不可变的。我还了解到,您无法获得托管对象的地址。
我想这么做:
a = "Donkey Kong"; // Now ArrayOfReallyVeryLongStringNames[439] = "Donkey Kong";
我读过堆栈溢出问题 https://stackoverflow.com/questions/10005351/c-sharp-make-a-reference-to-another-string ,它有一个很好的答案,但问题略有不同。我不想通过引用将这个参数传递给函数。我知道如何使用"ref“关键字通过引用传递参数。
如果答案是“您不能在C#中这样做”,那么有一个方便的解决办法吗?
编辑:一些答案表明这个问题不清楚。让我们以另一种方式问它。假设我需要操作原始长名数组中所有具有主要索引的项。我想将别名添加到数组.2、Array.3、Array.5等列表中。然后,使用"for“循环修改列表中的项(可能是将刚刚创建的列表传递给函数)。
在C#中,“使用”关键字为类或命名空间创建别名。然而,从答案来看,不可能为变量创建别名。
发布于 2014-05-20 11:04:24
你能得到的最接近的是:
unsafe
string* a = &ArrayOfReallyVeryLongStringNames[439]; // no compile
}
这给了一个例外:
无法获取托管类型的地址、大小或声明指向托管类型(“字符串”)的指针
所以不不可能..。
还可以阅读这个 MSDN文章 ,它解释了可以使用哪些类型(闪存类型)。
发布于 2014-05-20 11:14:58
您可以创建一个包装器,它保存对基础数组和字符串索引的引用:
public sealed class ArrayStringReference
private readonly string[] _array;
private readonly int _index;
public ArrayStringReference(string[] array, int index)
_array = array;
_index = index;
public string Value
return _array[_index];
_array[_index] = value;
public override string ToString()
return Value;
}
那么,这将是可行的:
string[] ArrayOfReallyVeryLongStringNames = new string[500];
ArrayOfReallyVeryLongStringNames[439] = "Hello world!";
var strRef = new ArrayStringReference(ArrayOfReallyVeryLongStringNames, 439);
Console.WriteLine(ArrayOfReallyVeryLongStringNames[439]); // Outputs "Hello world!"
strRef.Value = "Donkey Kong";
Console.WriteLine(ArrayOfReallyVeryLongStringNames[439]); // Outputs "Donkey Kong"
通过提供一个隐式字符串运算符,您可以更方便地使用它,这样您就不必使用
.Value
来访问底层字符串:
// Add this to class ArrayStringReference implementation
public static implicit operator string(ArrayStringReference strRef)
return strRef.Value;
}
然后,不必像这样访问底层字符串:
strRef.Value = "Donkey Kong";
string someString = strRef.Value;
你可以这样做:
strRef.Value = "Donkey Kong";
|
|
大方的柠檬 · sql执行存储过程超时 不抛错-掘金 2 年前 |