标签: ref

C#中的ref和out是否与C++中的指针相同?

我只是用C#做了一个Swap例程:

static void Swap(ref int x, ref int y)
{
    int temp = x;
    x = y;
    y = temp;
}
Run Code Online (Sandbox Code Playgroud)

它与C++代码的作用相同:

void swap(int *d1, int *d2)
{
    int temp=*d1;
    *d1=*d2;
    *d2=temp;
}
Run Code Online (Sandbox Code Playgroud)

所以是refout关键字,比如C#的指针,而无需使用unsafe代码?

c# c++ pointers unsafe ref

8
推荐指数
2
解决办法
5924
查看次数

F#成员约束+ ^ a byref参数

在玩了一些F#成员约束功能并编写如下函数之后:

let inline parse< ^a when ^a : (static member Parse: string -> ^a) > s =
    (^a: (static member Parse: string -> ^a) s)
Run Code Online (Sandbox Code Playgroud)

这很好用:

let xs = [ "123"; "456"; "999" ] |> List.map parse<int>
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写其他func tryParse,它使用静态方法TryParse并将解析结果包装到'a option类型中以便在F#中获得更好的支持.像这样的东西不编译:

let inline tryParse s =
    let mutable x = Unchecked.defaultof< ^a>
    if (^a: (static member TryParse: string * ^a byref -> bool) (s, &x))
        then Some x else None
Run Code Online (Sandbox Code Playgroud)

错误是:

错误FS0001:此表达式的类型为 byref <'a>, 但此处的类型为 "a …

generics f# constraints ref byref

8
推荐指数
1
解决办法
1169
查看次数

当param类型为List <BaseClass>时,如何传递List <DerivedClass>?

我如何传递一个列表,该列表是一个DerivedObjects列表,其中Method期望一个BaseObjects列表.我正在转换列表.ToList<BaseClass>(),我想知道是否有更好的方法.我的第二个问题是语法不正确.我试图传递列表byref,我收到一个错误:'ref' argument is not classified as a variable

我该如何解决这两个问题?谢谢.

public class BaseClass { }
public class DerivedClass : BaseClass { }

class Program
{
    static void Main(string[] args)
    {
        List<DerivedClass> myDerivedList = new List<DerivedClass>();
        PassList(ref myDerivedList.ToList<BaseClass>());
// SYNTAX ERROR ABOVE IS - 'ref' argument is not classified as a variable

        Console.WriteLine(myDerivedList.Count);
    }

    public static void PassList(ref List<BaseClass> myList)
    {
        myList.Add(new DerivedClass());
        Console.WriteLine(myList.Count);
    }
}
Run Code Online (Sandbox Code Playgroud)

解决了:

类似的方法解决了我的问题.

public static void PassList<T>(ref List<T> myList) where T : BaseClass
{ …
Run Code Online (Sandbox Code Playgroud)

c# ref generic-list derived-class

8
推荐指数
2
解决办法
4636
查看次数

在C++ 11中,你可以将ref'ed基类传递给线程的构造函数并获得多态行为吗?

我观察到Visual Studio 11 Beta中的新库与使用thread()和ref()的Boost之间的行为有所不同.我想知道谁是对的.如果标准偏离Boost的原始实现,则可能是两者.(但我不打算破译标准...)

我会用MinGW尝试过... Alas,AFAIK,<thread>对MinGW无效.

那么,第一个问题是,gcc和Clang是否表现出相同的编译失败?如果他们不这样做,我将提交一个针对VS的错误.第二个问题可能是,如果编译失败是正确的,我的解决方法是什么来获得Boost给我的东西(没有继续使用Boost)?

而且我想我确实有第三个问题......我开始做什么甚至犹豫不决?

class base
{
public:
    virtual void operator()() = 0;
};

class derived : public base
{
public:
    virtual void operator()()
    {
        cout << "derived" << endl;
    }
};

int main()
{
    base *b = new derived;

    std::thread t(std::ref(*b)); // Nasty compilation errors.

    boost::thread t(boost::ref(*b)); // Works fine.

    t.join();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading ref c++11

8
推荐指数
1
解决办法
394
查看次数

更新匿名方法内的ref参数

是否有解决方法来更新匿名方法中的ref参数?

我知道匿名方法不允许访问外部作用域的ref参数,但还有另一种方法吗?我正在为MessageStream使用外部库,因此无法更改委托的参数...

void DoWork(ref int count)
{
    MessageStream Stream = new MessageStream();
    Stream.MessageReceived += (o, args) =>
    {
        //Error cannot use ref or out parameter inside anonymous method
        count++;
    };
}
Run Code Online (Sandbox Code Playgroud)

c# anonymous-methods ref

8
推荐指数
1
解决办法
1940
查看次数

Vue.js - this.$refs.key 返回一个空数组或 undefined 而不是元素

我在 Vue 2 中有一个对话框窗口组件,它正在侦听事件tcs-show-confirm(它与显示对话框的事件相同,将show属性设置为 true - 在父组件中):

  @Prop({ default: false })
  show: boolean;

  @Prop()
  buttons: Array<TcsDialogButton>;

  mounted() {

    this.$nextTick(function () {
      TcsEventBus.$on('tcs-show-confirm', () => {
        console.log(this.$refs.tcsdialbuttons);
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

组件的 html 在这里(页脚插槽的内容不会被另一个组件的 html 替换):

  ...
  <slot name="footer">
    <div v-if="buttons && buttons.length" ref="tcsdialbuttons" v-for="(button, index) in buttons">
      <button tabindex="0" class="tcs-button tcs-dialog__button" @click="$emit('close', button.emitString)">
        {{button.text}}
      </button>              
    </div>
    <div style="clear: both;"></div>
  </slot>
  ...
Run Code Online (Sandbox Code Playgroud)

问题是 console.log(this.$refs.tcsdialbuttons) 显示一个空数组 [],长度为 0。这是为什么呢?如何访问按钮并将焦点设置在第一个上?


我还尝试将胖箭头功能更改为正常功能:

      TcsEventBus.$on('tcs-show-confirm', function() {
        console.log(this.$refs.tcsdialbuttons);
      });
Run Code Online (Sandbox Code Playgroud)

但现在它返回未定义。


我刚刚发现我不能引用组件中的任何元素,即使它在我的项目中的其他组件中工作。我不明白。。

javascript dom ref vue.js vue-component

8
推荐指数
1
解决办法
2557
查看次数

为什么我可以ref返回仅存在于方法内的数组项?

我正在尝试C#7的新ref参考.

我能够编译和构建这个:

        public ref string MisUseRefReturn(int index)
    {
        string[] array = { "a", "b", "c", "d" };
        return ref array[index]; //array[2] gets out of scope when this method returns!
    }
Run Code Online (Sandbox Code Playgroud)

根据MSDN:返回值不能是返回它的方法中的局部变量; 它的范围必须超出返回它的方法.它可以是类的实例或静态字段,也可以是传递给方法的参数.尝试返回局部变量会生成编译器错误CS8168,"无法通过引用返回本地'obj',因为它不是ref本地."

那为什么这会编译?当我执行此方法时,返回的引用显示正确的字符串.

ref c#-7.0

8
推荐指数
2
解决办法
240
查看次数

Vue - 使用ref访问嵌套的子级

我有自己内部使用的vue组件 - 数据可以有子元素的数组,我使用这个数组来循环渲染它们,下一级,下一级等等根据嵌套级别.

现在我想从父运行子方法然后 - 如果语句没问题,也可以调用它给孩子,下一级等.

我用

    <mycomponent
            ref="myFirstLevelRefName"
            (...)
    ></mycomponent>
Run Code Online (Sandbox Code Playgroud)

然后:

this.$refs.myFirstLevelRefName 
Run Code Online (Sandbox Code Playgroud)

打电话给第一级孩子.但是关于子节点呢?我以这种方式在视图中使用它们:

    <mycomponent
            v-for="(subElement, index) in getSubelements()"
            ref="???"
            v-bind:data="subElement"
            v-bind:key="index"
    ></mycomponent>
Run Code Online (Sandbox Code Playgroud)

我尝试发送这个.$ refs从子级别到控制台,但它是空的.

我应该如何在嵌套元素中设置引用名称,然后从父级调用它们?

nested ref vue.js vue-component

8
推荐指数
1
解决办法
1万
查看次数

如果可以的话,我们应该总是通过ref返回吗?

现在有了C#7,我们可以通过ref返回return ref.根据我的收集,参考是32位或64位.现在,如果我有一个结构Coordlong Xlong Y,这将是128位,所以它会更容易通过参考返回坐标,(以及通过它),以避免复制的128位.

另一方面,如果我尝试return refa byte,只有8位,对它的引用会比复制字节本身大得多,对吧?

所以,我的主要问题是:如果我们想要返回的对象可以返回ref(即,不是局部变量)并且其大小大于引用的大小,那么我们应该返回ref吗?

编辑:快速代码示例

// This size is 128 bytes, which is 2 or 4x larger than the size of a reference
public struct Coord                                 
{
    public long X, Y;
}

private Coord myCoord;

// This will return the Coord by value, meaning copying the full 128 bytes
public Coord GetCoordValue() => myCoord;          

// This will return the …
Run Code Online (Sandbox Code Playgroud)

c# optimization ref c#-7.0 c#-7.2

8
推荐指数
1
解决办法
417
查看次数

使用React.createRef创建引用而不在React中使用构造函数?

基本上,我只用constructorReact3个原因-

1.如要初始化state-

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = { counter: 0 };
    }
}
Run Code Online (Sandbox Code Playgroud)

但是由于Babel的班级领域支持,我不再使用它

class App extends React.Component {
    state = { counter: 0 };
}
Run Code Online (Sandbox Code Playgroud)

2. bind像-

class App extends React.Component {
    constructor(props) {
        super(props);
        this.increment.bind(this);
    }

    increment() {

    }
}
Run Code Online (Sandbox Code Playgroud)

但是由于arrow功能原因,我不再这样做了

class App extends React.Component {
    increment = () => {

    }
}
Run Code Online (Sandbox Code Playgroud)

3.如要使用createRef-

class App extends React.Component {
    constructor(props) …
Run Code Online (Sandbox Code Playgroud)

javascript ref reactjs

8
推荐指数
2
解决办法
3174
查看次数