StackOverflow上的几个C#问题询问如何使用out或ref参数创建匿名委托/ lambdas .例如,见:
为此,您只需指定参数的类型,如:
public void delegate D(out T p);
// ...
D a = (out T t) => { ... }; // Lambda syntax.
D b = delegate(out T t) { ... }; // Anonymous delegate syntax.
Run Code Online (Sandbox Code Playgroud)
我很好奇的是为什么明确要求类型.有这种情况的特殊原因吗?也就是说,从编译器/语言的角度来看,为什么不允许以下内容?
D a = (out t) => { ... }; // Lambda syntax -- implicit typing.
D b = delegate(out t) { ... }; // Anonymous delegate syntax -- implicit typing.
Run Code Online (Sandbox Code Playgroud)
甚至更好,只是:
D a = (t) …Run Code Online (Sandbox Code Playgroud) 在stackoverflow上读取后,在检查DateTime的格式的情况下,您应该使用DateTime.TryParse.在尝试了一些正则表达式后,他们似乎变得冗长而讨厌,希望覆盖大量的格式.
但TryParse需要一个"out"参数,因为我只想进行验证格式检查,所以我不需要实际的结果.
所以我留下了一个保持"out"结果的变量,并且我不做任何事情.有没有办法,所以我不必做一个out参数?
所以我摆脱了这个警告,并停止变量只是飞来飞去.
当我对一个out或ref参数进行赋值时,是否会立即将值赋给调用者提供的引用,还是在方法返回时分配给引用的out和ref参数值?如果方法抛出异常,则返回值吗?
例如:
int callerOutValue = 1;
int callerRefValue = 1;
MyMethod(123456, out callerOutValue, ref callerRefValue);
bool MyMethod(int inValue, out int outValue, ref int refValue)
{
outValue = 2;
refValue = 2;
throw new ArgumentException();
// Is callerOutValue 1 or 2?
// Is callerRefValue 1 or 2?
}
Run Code Online (Sandbox Code Playgroud) 我有一个带有以下签名的方法:
private PropertyInfo getPropertyForDBField(string dbField, out string prettyName)
Run Code Online (Sandbox Code Playgroud)
在其中,我prettyName根据给定的值找到相关值dbField.然后,我想要查找具有该名称的所有属性(如果有)prettyName,因此我尝试执行以下操作:
IEnumerable<PropertyInfo> matchingProperties =
getLocalProperties().Where(prop =>
prop.Name.Equals(prettyName)
);
Run Code Online (Sandbox Code Playgroud)
但是,这会产生以下错误:
不能在匿名方法,lambda表达式或查询表达式中使用ref或out参数'prettyName'
通过我试图prettyName在Wherelambda参数中使用的方法中的点,prettyName肯定是初始化的.我return如果prettyName无法初始化为有效值.我可以在这里做一些技巧让我prettyName在lambda表达式中使用吗?
编辑:如果重要的话,我正在使用.NET 3.5.
在这段代码中:
public bool SomeMethod(out List<Task> tasks)
{
var task = Task.Factory.StartNew(() => Process.Start(info));
tasks.Add(task);
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,"使用未分配的参数'任务'".为什么?
在MSDN示例中,只使用out参数
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
Run Code Online (Sandbox Code Playgroud)
是因为List<T>?
如何为具有out-parameter 的委托定义DynamicMethod ,如下所示?
public delegate void TestDelegate(out Action a);
Run Code Online (Sandbox Code Playgroud)
假设我只想要一个将a参数设置为null调用方法的方法.
请注意,我知道处理这个问题的一个更好的方法是让方法返回Action委托,但这只是一个较大项目的简化部分,并且该方法已经返回一个值,我需要处理out参数除了它,因此问题.
我试过这个:
using System;
using System.Text;
using System.Reflection.Emit;
namespace ConsoleApplication8
{
public class Program
{
public delegate void TestDelegate(out Action a);
static void Main(String[] args)
{
var method = new DynamicMethod("TestMethod", typeof(void),
new Type[] { typeof(Action).MakeByRefType() });
var il = method.GetILGenerator();
// a = null;
il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Starg, 0);
// return
il.Emit(OpCodes.Ret);
var del = (TestDelegate)method.CreateDelegate(typeof(TestDelegate));
Action a;
del(out a);
} …Run Code Online (Sandbox Code Playgroud) C#:函数中的'out'out'参数是对象属性/变量吗?
例如:
我可以调用函数如下:
someFunction(x, y, out myObject.MyProperty1)
Run Code Online (Sandbox Code Playgroud) 在PL/SQL(或许多其他语言)中,我可以使用IN OUT或OUT参数,这些参数是从过程返回的.如何在Java中实现类似的功能?
我知道这个伎俩:
public void method(String in, String[] inOut, String[] inOut2) {
inOut[0] = in;
}
Run Code Online (Sandbox Code Playgroud)
其中in参数表示IN参数,inOut参数可以包含返回值.惯例将String[] inOut是一个数组inOut.length == 1.
那有点笨拙.
编辑反馈答案:其他技巧包括:
有没有人知道更好的方法来实现这一目标?我需要一般解决方案的原因是因为我想在数据库模式中从PL/SQL生成便利源代码.
我想创建一个简单的泛型函数
void Assign<T>(out T result)
{
Type type = typeof(T);
if (type.Name == "String")
{
// result = "hello";
}
else if (type.Name == "Int32")
{
// result = 100;
}
else result = default(T);
}
Run Code Online (Sandbox Code Playgroud)
用法:
int value;
string text;
Assign(value); // <<< should set value to 100
Assign(text); // <<< should set text to "hello"
Run Code Online (Sandbox Code Playgroud)
我的问题是如何编写代码来设置这些值,即.评论部分中缺少的代码.
谢谢你的帮助.
out-parameters ×10
c# ×9
.net ×2
lambda ×2
delegates ×1
generics ×1
java ×1
linq ×1
list ×1
parameters ×1