这真是让我烦恼,来自C#背景.
有时,我看到这样写的函数:
int computeResult();
Run Code Online (Sandbox Code Playgroud)
这就是我习惯的.但后来我发现它们写得像这样:
void computeResult(int &result);
Run Code Online (Sandbox Code Playgroud)
我觉得这很奇怪.如果有的话,第二种方法比第一种方法有什么好处?必须有一些东西,因为我一直都在看.
关于"ref"和"out"参数的定义已经存在许多问题,但它们看起来像是糟糕的设计.您是否认为ref是正确的解决方案?
看起来你总能做一些更干净的事情.有人能给我一个例子,说明这将成为问题的"最佳"解决方案吗?
当方法接受ValueType的out/ref参数时,是否会发生装箱/取消装箱?
代码:
import DrawControl from "react-mapbox-gl-draw";
export default function MapboxGLMap() {
let drawControl = null
return(
<DrawControl ref={DrawControl => {drawControl = DrawControl}}/>
)
}
Run Code Online (Sandbox Code Playgroud)
我想在drawControl非空时加载数据。我检查了可能使用回调引用的文档。
那么,我如何监听drawControl更改并加载数据?
假设我有一个Person班级并且具有以下内容:
Person A = new Person("Tom");
Person B = A;
Run Code Online (Sandbox Code Playgroud)
有没有一种方法,我可以改变它,这样,如果我分配一个新的Person来B,B = new Person("Harry"),A是指同一个实例吗?我知道你可以ref在函数中的参数赋值中做到这一点.
我是Powershell的新手,我正在尝试研究如何在函数中打印[ref]变量的值.
这是我的测试代码:
function testref([ref]$obj1) {
$obj1.value = $obj1.value + 5
write-host "the new value is $obj1"
$obj1 | get-member
}
$foo = 0
"foo starts with $foo"
testref([ref]$foo)
"foo ends with $foo"
Run Code Online (Sandbox Code Playgroud)
我从这个测试得到的输出如下.你会注意到我没有像我希望的那样得到$ obj1的值.我也试过在写入主机的调用中传入$ obj1.value但是生成了相同的响应.
PS > .\testref.ps1
foo starts with 0
the new value is System.Management.Automation.PSReference
TypeName: System.Management.Automation.PSReference
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Value Property System.Object Value {get;set;}
foo ends with …Run Code Online (Sandbox Code Playgroud) 所以这有效..
public MyClass(ref Apple apple)
{
apple = new Apple("Macintosh"); // Works fine
}
Run Code Online (Sandbox Code Playgroud)
但有可能做这样的事情吗?
private Apple myApple;
public MyClass(ref Apple apple)
{
myApple = apple;
}
public void ModifyApple()
{
myApple = new Apple("Macintosh"); // does not change the input variable like the first example did
}
Run Code Online (Sandbox Code Playgroud)
当ref变量被复制到成员变量时,myApple它似乎失去了它的'ref-ness'并且重新赋值它不再改变输入变量.有没有解决的办法?
我用我现有的解决方案尝试了VS2015,我得到了一些有效的新错误(比如编译器之前没有捕获到的无法访问的代码),但是我在这一行上也遇到了错误:
bool bWasAlreadyLocked = false;
oEnv.LockDoc(oWarnings, oEventDoc, ref bWasAlreadyLocked);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误CS1503参数3:无法从'ref bool [mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]'转换为'ref bool [mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089] "
我不明白为什么它会抛出那个错误,显然类型确实匹配.这是新编译器中的错误还是ref关键字的行为发生了变化?
这种情况下的函数是一个C++函数,它使用从c ++类派生的ac#类导入到C#.它的签名是这样的:
void CBkgDocEnvX::LockDoc(
CFIWarningList ^oWarnings,
CBaseDoc ^oBaseDoc,
// Output
bool %rbWasAlreadyLocked)
Run Code Online (Sandbox Code Playgroud)
值得一提的是,我现在选择在解决方案中使用VS2013 c ++编译器作为c ++源代码,因此c ++方面应该与以前一样.我的猜测是c#和c ++之间的互操作发生了变化.
我遇到了一段使用委托的C#代码,并通过引用将该函数传递给委托......
delegate bool MyDel(int x);
static bool fun(int x) {
return x < 0;
}
public static void Main() {
var d1 = new MyDel(fun); // what I usually write
var d2 = new MyDel(ref fun);
}
Run Code Online (Sandbox Code Playgroud)
编译器没有抱怨并且建立了项目.我在运行一些测试用例时没有发现任何差异,这种语法与通常的语法有什么不同?
正如InBetween所提到的,似乎这种语法也是有效的(而且它的意义更小)
var d3 = new MyDel(out fun);
Run Code Online (Sandbox Code Playgroud) 例如,
public int DoSomething(in SomeType something){
int local(){
return something.anInt;
}
return local();
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器会发出无法在局部函数中使用 some 变量的错误?