我可以返回对double值的引用吗?
这就是我想要做的:
ref double GetElement()
{
......
// Calculate x,y,z
return ref doubleArray[x,y,z];
}
Run Code Online (Sandbox Code Playgroud)
要像这样使用它
void func()
{
GetElement()=5.0;
}
Run Code Online (Sandbox Code Playgroud)
这就像在C++中返回一个双指针......我知道我写它的方式是错误的......但是有没有正确的方法呢?
我来自C++背景.之前已经问过这个问题,但试着尽可能找不到答案.比方说我有:
string[] ArrayOfReallyVeryLongStringNames = new string[500];
ArrayOfReallyVeryLongStringNames[439] = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
我可以创建一个引用上面的字符串(这些都不会编译):
string a = ref ArrayOfReallyVeryLongStringNames[439]; // no compile
string a = &ArrayOfReallyVeryLongStringNames[439]; // no compile
Run Code Online (Sandbox Code Playgroud)
我确实理解字符串在C#中是不可变的.我也明白你无法获得托管对象的地址.
我想这样做:
a = "Donkey Kong"; // Now ArrayOfReallyVeryLongStringNames[439] = "Donkey Kong";
Run Code Online (Sandbox Code Playgroud)
我已经阅读了Stack Overflow问题在C#中引用了另一个字符串, 它有一个很好的答案,但问题略有不同.我不想通过引用将此参数传递给函数.我知道如何使用"ref"关键字通过引用传递参数.
如果答案是"您不能在C#中执行此操作",是否有方便的解决方法?
编辑:一些答案表明问题不清楚.让我们以不同的方式问它.假设我需要操纵原始长命名数组中具有主要索引的所有项目.我想在Array ... [2],Array ... [3],Array ... [5]等中添加别名到列表中.然后,使用"for"循环修改列表中的项目(可能通过将刚创建的列表传递给函数).
在C#中,"using"关键字为类或命名空间创建别名.从答案来看,似乎无法为变量创建别名.
在C++中我可以这样做:
int flag=0,int1=0,int2=1;
int &iRef = (flag==0?int1:int2);
iRef +=1;
Run Code Online (Sandbox Code Playgroud)
具有int1增加的效果.
我必须修改一些旧的c#代码,如果我可以做类似的事情,那将会非常有用,但我在考虑......也许不是.任何人?
在C++中有一个建议:"永远不要返回对本地对象的引用",如下面引用的"C++ Primer":
"关于返回引用,有一个至关重要的事情要理解:永远不要返回对局部变量的引用.
"当函数完成时,释放分配本地对象的存储.对函数终止后对本地对象的引用是指未定义的内存.请考虑以下函数:
// Disaster: Function returns a reference to a local object
const string &manip(const string& s)
{
string ret = s;
// transform ret in some way
return ret; // Wrong: Returning reference to a local object!
}
Run Code Online (Sandbox Code Playgroud)
"此函数在运行时将失败,因为它返回对本地对象的引用.当函数结束时,将释放ret所在的存储.返回值指的是程序不再可用的内存."
问题:这仍然适用于C#吗?或者引入GC无关紧要?
我一直在搜索,但我找不到任何方法来存储对某个变量中另一个变量的引用.我正在尝试创建一个类来撤消用户完成的事情;
class UndoAction
{
public object var;
public object val;
public UndoAction(ref object var, object val)
{
this.var = var;
this.val = val;
}
public static List<UndoAction> history = new List<UndoAction>();
public static void AddHistory(ref object var, object val)
{
history.Add(new UndoAction(ref var, val));
}
}
Run Code Online (Sandbox Code Playgroud)
我想你可以看到我在这里想要实现的目标.
我跑的问题;
this.var = var;
Run Code Online (Sandbox Code Playgroud)
不存储引用,而是存储引用的'var'的值.我如何存储引用本身,所以我可以简单地运行;
this.var = val;
Run Code Online (Sandbox Code Playgroud)
在我的情况下,"撤消"一个动作?
在下面的代码是什么的意义ref的GetAge()方法签名?
public class Person
{
private int age;
public ref int GetAge()
{
return ref this.age;
}
}
Run Code Online (Sandbox Code Playgroud) 在这个问题中:为什么C#不支持返回引用(以及Web上的其他地方),我无法确定何时ref return引入.NET框架.它只是语法糖吗?
我要问的原因是我们的许多主机都没有安装最新的.NET框架版本(仍然在4.5.2上),我想知道这将如何影响CLR向后兼容性,运行时正确性和性能.
此外,我在哪里可以找到有关较旧的.NET框架如何处理向后兼容性的文档?C#6.0语言规范似乎没有涵盖这个,也许我在某种程度上跳过这个?
在以下场景中,"Pool"是按值还是按引用返回的?
private static List<Item> Pool;
public static List<Item> GetPool()
{
return Pool;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在请求时实现循环遍历列表的能力(这样另一个线程可以在列表中添加/删除项目,但调用线程的列表保持不变,以便foreach循环不会导致异常).如果它是按值返回的,那么它将是它自己的列表,而如果它是一个引用,我仍然有被修改列表的危险.如果有任何问题请纠正我,这只是我的理解
在VB中,我们有Handles子句,它允许将Handler添加到控件的事件中,而不将其放入xaml文件中(直接放入VB文件中).
XAML:
<Button x:Name="myButton" />
Run Code Online (Sandbox Code Playgroud)
VB:
Private Sub Button_Click() Handles myButton.Click
End Sub
Run Code Online (Sandbox Code Playgroud)
可以使用该做的好处之一是使用Visual Studio的下拉列表中自动添加事件,而不需要去XAML文件,并改变它的可能性.阅读这个问题(和答案),以便更好地理解我在说什么:
这个问题的答案并没有具体说明为什么C#没有在Visual Studio中这个功能,但很明显对我来说:因为它使用了Handles子句对代码隐藏添加事件C#不具备此功能.
我知道我们可以使用+ =并在构造函数上手动添加事件,在InitializeComponent下面(这几乎是同一件事),但是VB也有AddHandler可以在构造函数(以及其他地方)上添加事件,并且它不是自动的,对我来说不如Handles条款可靠.
我的问题是:
为什么它从未实施?这不可靠吗?非安全?有什么解决方法吗?