我只是用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)
所以是ref和out关键字,比如C#的指针,而无需使用unsafe代码?
在玩了一些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 …
我如何传递一个列表,该列表是一个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) 我观察到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) 是否有解决方法来更新匿名方法中的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) 我在 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)
但现在它返回未定义。
我刚刚发现我不能引用组件中的任何元素,即使它在我的项目中的其他组件中工作。我不明白。。
我正在尝试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本地."
那为什么这会编译?当我执行此方法时,返回的引用显示正确的字符串.
我有自己内部使用的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从子级别到控制台,但它是空的.
我应该如何在嵌套元素中设置引用名称,然后从父级调用它们?
现在有了C#7,我们可以通过ref返回return ref.根据我的收集,参考是32位或64位.现在,如果我有一个结构Coord用long X和long 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) 基本上,我只用constructor了React3个原因-
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)
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)
createRef-class App extends React.Component {
constructor(props) …Run Code Online (Sandbox Code Playgroud) ref ×10
c# ×4
c#-7.0 ×2
c++ ×2
javascript ×2
vue.js ×2
byref ×1
c#-7.2 ×1
c++11 ×1
constraints ×1
dom ×1
f# ×1
generic-list ×1
generics ×1
nested ×1
optimization ×1
pointers ×1
reactjs ×1
unsafe ×1