我今天早些时候试过这个:
public interface IFoo
{
IEnumerable<int> GetItems_A( ref int somethingElse );
IEnumerable<int> GetItems_B( ref int somethingElse );
}
public class Bar : IFoo
{
public IEnumerable<int> GetItems_A( ref int somethingElse )
{
// Ok...
}
public IEnumerable<int> GetItems_B( ref int somethingElse )
{
yield return 7; // CS1623: Iterators cannot have ref or out parameters
}
}
Run Code Online (Sandbox Code Playgroud)
这背后的理由是什么?
我正在使用ref并且不明白"它是像C/C++中的指针还是像C++中的引用一样?"
为什么我问你这么弱的问题?因为,当我正在阅读C#/.NET书籍,msdn或与C#开发人员交谈时,我会因以下原因而感到困惑:
ref在函数的参数中使用,e.g. ...(ref Type someObject)对他们没有好处,他们建议...(Type someObject),我真的不明白这个建议.我听到的原因:更好地处理对象的副本,然后将其用作返回值,而不是通过引用等来破坏内存...通常我会听到有关数据库连接对象的这种解释.就像我简单的C/C++体验一样,我真的不明白为什么使用引用是C#中的坏东西?我控制对象的生命及其内存分配/重新分配等...我在书籍和论坛中只读了建议it's bad, because you can corrupt your connection and cause a memory leak by a reference lose,所以我控制对象的生命,我可以手动控制我真正想要的东西,那为什么它不好?ref一个指针(*)或像C++中的引用&吗?我记得C/C++中的指针总是分配一个大小为void*4字节的空间(有效大小取决于体系结构),其中主机是结构或变量的地址.在C++中,通过传递引用&,没有来自堆/堆栈的新分配,并且您在内存空间中使用已定义的对象,并且外部没有像在纯C中那样的指针的子分配内存.那么refC#中的内容是什么?.NET VM是否像普通C/C++中的指针一样处理它,它为指针GC分配临时空间,还是像C++中的引用那样工作?是否ref只能正确使用托管类型或者类似于值类型bool, int,更好地切换unsafe代码并以非托管样式传递指针?我有以下功能:
public static extern uint FILES_GetMemoryMapping(
[MarshalAs(UnmanagedType.LPStr)] string pPathFile,
out ushort Size,
[MarshalAs(UnmanagedType.LPStr)] string MapName,
out ushort PacketSize,
ref Mapping oMapping,
out byte PagesPerSector);
Run Code Online (Sandbox Code Playgroud)
我想这样称呼:
FILES_GetMemoryMapping(MapFile, out size, MapName,
out PacketSize, null, out PagePerSector);
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法传递null一个需要类型的字段ref Mapping而且没有投射我已经尝试修复此问题.
有什么建议?
什么是什么ref class以及什么时候宣布一个类是"ref class"的任何好的网站或解释?
关于msdn的解释对我来说还不够,
base_type(可选)
基本类型.ref类或ref结构可以从零个或多个托管接口以及零个或一个ref类型继承.值类或值结构只能从零个或多个托管接口继承.
REF
该
ref关键字告诉编译器将在堆上分配类或结构,并且对它的引用将传递给函数或存储在类成员中.该value关键字告诉编译器类或结构中的所有数据都传递给函数或存储在成员中.
如何从存储过程(OUT变量)返回的引用游标中获取并将结果行打印到SQL*PLUS中的STDOUT?
ORACLE存储过程:
PROCEDURE GetGrantListByPI(p_firstname IN VARCHAR2, p_lastname IN VARCHAR2,
p_orderby IN VARCHAR2, p_cursor OUT grantcur);
Run Code Online (Sandbox Code Playgroud)
PL/SQL:
SET SERVEROUTPUT ON;
DECLARE
TYPE r_cursor IS REF CURSOR;
refCursor r_cursor;
CURSOR grantCursor IS
SELECT last_name, first_name
FROM ten_year_pis
WHERE year_added = 2010;
last_name VARCHAR2(100);
first_name VARCHAR2(100);
BEGIN
OPEN grantCursor;
FETCH grantCursor INTO last_name, first_name;
WHILE grantCursor%FOUND LOOP
PMAWEB_PKG.GetGrantListByPI(last_name, first_name, 'last_name', refCursor);
--HOW DO I LOOP THROUGH THE RETURNED REF CURSOR (refCursor)
--AND PRINT THE RESULTING ROWS TO STDOUT?
FETCH grantCursor into last_name, first_name; …Run Code Online (Sandbox Code Playgroud) 我做了一些ref关键字测试,有一个认为我无法理解:
static void Test(ref int a, ref int b)
{
Console.WriteLine(Int32.ReferenceEquals(a,b));
}
static void Main(string[] args)
{
int a = 4;
Test(ref a, ref a);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
为什么显示此代码False?我知道这int是一个值类型,但在这里它应该传递对同一个对象的引用.
我试图从父组件调用子组件方法,我试图使用 useRef。将来,SayHi 方法将更新子组件中的钩子状态。不幸的是,我有无法处理的错误。
行:ref.current.SayHi();
类型“ForwardRefExoticComponent<{ name: string;”上不存在属性“SayHi” } & RefAttributes<{ SayHi: () => void; }>>'。
行:< Child name="Adam" ref={ref}/>
输入'RefObject void; }>>>' 不能分配给类型 '((instance: { SayHi: () => void; } | null) => void) | RefObject<{ SayHi: () => void; }> | 空| 不明确的'。输入'RefObject void; }>>>' 不能分配给类型 'RefObject<{ SayHi: () => void; }>'。“ForwardRefExoticComponent<{ name: string;”类型中缺少“SayHi”属性 } & RefAttributes<{ SayHi: () => void; }>>' 但在类型 '{ SayHi: () => void; 中是必需的; }'。
完整的 test.tsx 文件:
import React, { useRef, …Run Code Online (Sandbox Code Playgroud) 我正在搞乱我的C#项目,我很惊讶看到这段代码编译:
var a = new Action<string>(ref b => b = "hello");
Run Code Online (Sandbox Code Playgroud)
反过来翻转,就像Action<string> a = ref b => b = "hello";在'ref'处给出语法错误一样.
果然,将片段复制粘贴到http://dotnetfiddle.net会产生编译错误:
A ref or out argument must be an assignable variable
Run Code Online (Sandbox Code Playgroud)
我在编译器中遇到过错误吗?(我正在使用VS 2015和C#6.)
编辑:刚刚切换到.NET Fiddle上的Roslyn编译器,它仍然会发出相同的错误.
我现在正在用 React 构建一个旋转木马。要滚动到我使用的单个幻灯片,document.querySelector如下所示:
useEffect(() => {
document.querySelector(`#slide-${activeSlide}`).scrollIntoView({
behavior: 'smooth',
block: 'nearest',
inline: 'nearest'
});
}, [activeSlide]);
Run Code Online (Sandbox Code Playgroud)
这是不好的做法吗?毕竟,我在这里直接访问 DOM?这样做的 React 方式是什么?
编辑:完整return方法
return (
<>
<button onClick={() => setActiveSlide(moveLeft)}>PREV</button>
<Wrapper id="test">
{children.map((child, i) => {
return (
<Slide id={`slide-${i}`} key={`slide-${i}`}>
{child}
</Slide>
);
})}
</Wrapper>
<button onClick={() => setActiveSlide(moveRight)}>NEXT</button>
</>
);
Run Code Online (Sandbox Code Playgroud) C#有一个ref关键字.使用ref,您可以通过引用将int传递给方法.当您调用通过引用接受int的方法时,堆栈帧上会发生什么?
public void SampleMethod(ref int i) { }
Run Code Online (Sandbox Code Playgroud) ref ×10
c# ×6
parameters ×2
reactjs ×2
boxing ×1
cursor ×1
delegates ×1
javascript ×1
managed-c++ ×1
null ×1
oracle ×1
out ×1
pinvoke ×1
plsql ×1
pointers ×1
reference ×1
roslyn ×1
tsx ×1
typescript ×1
use-effect ×1