做出来的参数C#有任何性能影响我应该知道的?(像例外)
我的意思是,out在循环中使用一个参数的方法是一个好主意,每秒运行几百万次?
我知道它很丑,但我使用它的方式与Int32.TryParse使用它们相同- 返回一个bool告诉我是否有一些验证是成功的,并且如果成功则有一个out包含一些额外数据的参数.
当方法接受ValueType的out/ref参数时,是否会发生装箱/取消装箱?
在C#中,我使用a StreamReader来读取文件,每行一行.我还保留当前行的编号int,以报告可能的错误消息.
阅读每一行都会进行一些测试(例如,开头的行#是注释,需要跳过),所以我打算将整个阅读过程放在一个函数中,这将继续阅读,直到它遇到一个有用的行,然后返回该行.如果遇到EOF它就会返回null.
当我将此函数定义为时,我认为我很聪明string read(StreamReader sr, out int lineNumber),但现在事实证明C#将无法像lineNumber++在函数内部那样做.它假定变量尚未分配,可能是因为它无法知道它是否已在此函数调用之前分配.
所以,问题很简单:我如何指定这个变量是一个inout参数(我认为这是一个术语;我听说它是在其他编程语言的上下文中提到的)?这首先是可能的吗?我绝对不会成为lineNumber班上的一员,所以这不是一个选择.
鉴于这个神奇的界面:
public interface IHat<out TRabbit>
{
TRabbit Take();
}
Run Code Online (Sandbox Code Playgroud)
而这个类层次结构:
public class Rabbit { }
public class WhiteRabbit : Rabbit { }
Run Code Online (Sandbox Code Playgroud)
我现在可以编译这个:
IHat<WhiteRabbit> hat1 = null;
IHat<Rabbit> hat2 = hat1;
Run Code Online (Sandbox Code Playgroud)
哪个好.但是如果我以不同的方式定义界面呢:
public interface IHat<out TRabbit>
{
bool Take(out TRabbit r);
}
Run Code Online (Sandbox Code Playgroud)
我指出帽子可能是空的,使用单独的布尔返回值(之前的版本可能会从空帽子返回一个空兔子).但我仍然只输出一只兔子,所以没有做任何与以前版本逻辑上不同的事情.
CTP中的C#4.0编译器在接口定义中给出了错误 - 它要求'out'方法参数为不变类型.是否有一个强硬的原因,为什么不允许这样做,或者是否可以在未来版本中解决这个问题?
在阅读对答案的评论时,我看到了以下构造来声明和初始化变量:
int variable = int.TryParse(stringValue, out variable) ? variable : 0;
Run Code Online (Sandbox Code Playgroud)
在C#中这是允许的,正确的和明确定义的吗?引擎盖下会发生什么?以下是怎么回事?
variable第一初始化为零?int.TryParse(赋值)?int.TryParse返回true)?我正在尝试打印二叉树
void print_tree(Node * root,int level )
{
if (root!=NULL)
{
cout<< root->value << endl;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
如何缩进输出以使用' - '字符缩进每个值.
我不清楚为什么下面的代码片段不是covarient?
public interface IResourceColl<out T> : IEnumerable<T> where T : IResource {
int Count { get; }
T this[int index] { get; }
bool TryGetValue( string SUID, out T obj ); // Error here?
}
Run Code Online (Sandbox Code Playgroud)
错误1无效方差:类型参数"T"必须在'IResourceColl.TryGetValue(string,out T)'上不变地有效.'T'是协变的.
我的界面仅在输出位置使用模板参数.我可以轻松地将此代码重构为类似的东西
public interface IResourceColl<out T> : IEnumerable<T> where T : class, IResource {
int Count { get; }
T this[int index] { get; }
T TryGetValue( string SUID ); // return null if not found
}
Run Code Online (Sandbox Code Playgroud)
但我试图了解我的原始代码是否真的违反了协方差,或者这是协方差的编译器还是.NET限制.
我正在尝试创建一个程序,它将输入数据然后在OUT参数中返回一条消息,但是我收到此消息"参数5用于例行医院.alextest10不是BEFORE触发器中的变量或NEW伪变量"
我有这个作为我的程序:
create procedure alextest10
(IN a_patid CHAR(3), IN a_patnam VARCHAR(12), IN a_consno CHAR(3), IN a_ward CHAR(2),
OUT a_message VARCHAR(50))
BEGIN
set a_message = 'Database updated';
INSERT INTO patient (patient_id, patient_name, consultant_no, ward_no)
values (a_patid, a_patnam, a_consno, a_ward);
end!
Run Code Online (Sandbox Code Playgroud)
这是我的呼叫命令:
call alextest10 ('p99', 'Madeuppy', '999', 'w9', a_message)!
Run Code Online (Sandbox Code Playgroud)
你能帮我吗?
非常感激!
我想它与新println()行功能('\n')相关,但是在缩写的基于字母的形式中,这nl不是ln.谢谢你的任何评论.
void swap(int &first, int &second){
int temp = first;
first = second;
second = temp;
}
Run Code Online (Sandbox Code Playgroud)
//////
int a=3,b=2;
swap(a,b);
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,C编译器抱怨"void swap(int&first,int&second)"在"(/ {"之前有一个语法错误,如缺少"&".
我不明白为什么?C不支持此功能吗?