我想修改一个结构的字段,该结构在一个数组内,而不必设置整个结构.在下面的示例中,我想在数组中设置元素543的一个字段.我不想复制整个元素(因为复制MassiveStruct会损害性能).
class P
{
struct S
{
public int a;
public MassiveStruct b;
}
void f(ref S s)
{
s.a = 3;
}
public static void Main()
{
S[] s = new S[1000];
f(ref s[543]); // Error: An object reference is required for the non-static field, method, or property
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在C#中做到这一点?或者我总是要从数组中复制整个结构,修改副本,然后将修改后的副本放回到数组中.
如果我没有得到这个非常错误,这种行为对我来说很奇怪.而不是解释,我将在下面发布一个示例代码,请告诉我为什么我得到输出x而不是y.
private void button1_Click(object sender, EventArgs e)
{
List<int> l = new List<int>() { 1, 2, 3 };
Fuss(l);
MessageBox.Show(l.Count.ToString());
}
private void Fuss(List<int> l)
{
l.Add(4);
l.Add(5);
}
Run Code Online (Sandbox Code Playgroud)
输出应该,我假设是3.但我得到输出为5.我理解输出可以是5如果我这样做:
private void button1_Click(object sender, EventArgs e)
{
List<int> l = new List<int>() { 1, 2, 3 };
Fuss(ref l);
MessageBox.Show(l.Count.ToString());
}
private void Fuss(ref List<int> l)
{
l.Add(4);
l.Add(5);
}
Run Code Online (Sandbox Code Playgroud) 我刚刚看到一些(大概)C++代码,它运行着我不知道的两个"关键字"(我假设关键字但是,因为我没有上下文,所以它们可能很简单#define).
它们似乎也没有出现在C++ 11标准中,至少是我的草案,但由于这是一个非常晚的草案,我无法想象它们会在最后一分钟被放入标准.他们是ref和sealed.
我发现它们的代码是这样的:
public ref class DevIface sealed {
private:
int currOffset;
public:
DevIface (int initOffset);
: : :
Run Code Online (Sandbox Code Playgroud)
有谁知道这些关键词是什么,以及它们的意图是什么?
我已经使用 MUI 和 React Hook Form 在 React 中构建了一个表单。我正在尝试创建一个用作Select Input的自定义TextField元素。我希望它是一个带有Ref道具的不受控制的组件。我试图按照 MUI 和 React Hook Form 文档的建议传递 inputRef 道具,但没有成功。
<TextField
id="id"
name="name"
select
native="true"
className={classes.textField}
label="label"
margin="normal"
variant="outlined"
inputRef={register({ required: "Choose one option" })}
error={!!errors.name}
>
<MenuItem value="">Choose one option</MenuItem>
<MenuItem value="3">03</MenuItem>
<MenuItem value="6">06</MenuItem>
<MenuItem value="9">09</MenuItem>
<MenuItem value="12">12</MenuItem>
<MenuItem value="16">16</MenuItem>
<MenuItem value="18">18</MenuItem>
</TextField>
Run Code Online (Sandbox Code Playgroud)
我发现的一件事是,如果我将本机select与ref 一起使用,它就可以正常工作。
此外,我尝试将inputRef道具更改为SelectProps道具,但它也不起作用。
先感谢您。
嗨这是真的困扰我的事情,我希望有人能给我一个答案.我一直在阅读ref(和out),我正在试图弄清楚我是否正在使用refs 减慢我的代码.通常我会替换类似的东西:
int AddToInt(int original, int add){ return original+add; }
Run Code Online (Sandbox Code Playgroud)
同
void AddToInt(ref int original, int add){ original+=add; } // 1st parameter gets the result
Run Code Online (Sandbox Code Playgroud)
因为我的眼睛这个
AddToInt(ref _value, _add);
Run Code Online (Sandbox Code Playgroud)
比这更容易阅读和编码
_value = AddToInt(_value, _add);
Run Code Online (Sandbox Code Playgroud)
我确切地知道我在使用代码时正在做什么ref,而不是返回一个值.但是,性能是我认真对待的,显然,当你使用refs时,解除引用和清理会慢得多.
我想知道的是为什么我读的每个帖子都说你通常会传递的地方很少ref(我知道这些例子是人为的,但我希望你能得到这个想法),当我觉得这个ref例子是更小,更清洁,更准确.
我也很想知道为什么ref真的比返回一个值类型慢 - 对我来说,在我看来,如果我要在返回它之前编辑很多函数值,那么引用实际变量会更快在从内存中清除之前不久编辑它而不是该变量的实例.
如果你有一个Bitmap对象需要传递给众多方法(大约10个),最后到一个事件,它将在它被使用后最终被处理掉,是否(性能明智)将它传递给每一个那些方法通过引用而不是值?
按值传递,对象被复制,而不是通过引用传递.
(在这种情况下,性能至关重要.应用程序需要尽可能快地运行.)
考虑:
class Foo
{
private readonly string _value;
public Foo()
{
Bar(ref _value);
}
private void Bar(ref string value)
{
value = "hello world";
}
public string Value
{
get { return _value; }
}
}
// ...
var foo = new Foo();
Console.WriteLine(foo.Value); // "hello world"
Run Code Online (Sandbox Code Playgroud)
这甚至是如何编译的,但仍有效?我不应该_value为构造函数之外的字段分配不同的值,因为它标记为readonly.但是,将它传递ref给一个方法,它确实可以被操纵.
这有危险吗?为什么?我感觉不对,但我不能完全指责它.
我试图做这个.
我必须遗漏一些东西,但我不明白为什么current总是null在这个例子中.
class App extends React.PureComponent {
constructor(props) {
super(props);
this.test = React.createRef();
}
render() {
return <div className="App">current value : {this.test.current + ""}</div>;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里查看我的测试用例
in和参数有什么区别ref readonly?
我发现in和ref readonly参数都使参数只读,并且不能在被调用的方法中修改。它们有类似的功能吗?
如何为一个mongoose模式的一个属性编写多个ref,就像这样(但是错误的):
var Schema = mongoose.Schema;
var PeopleSchema = new Schema({
peopleType:{
type: Schema.Types.ObjectId,
ref: ['A', 'B'] /*or 'A, B'*/
}
})
Run Code Online (Sandbox Code Playgroud)