我在LINQPad中尝试了以下代码并获得了以下结果:
List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s)
{
s.Trim();
});
listFromSplit.Dump();
Run Code Online (Sandbox Code Playgroud)
"a"和"b"
所以字母b没有像我期待的那样去掉白色空间......?
有人有主意吗
[注意:.Dump()方法是LINQPad中的扩展方法,它以一种漂亮的智能格式打印出任何对象的内容]
假设我有以下代码:
public class Foo
{
private int x;
private int y;
public Bar CreateBar()
{
return new Bar(x, () => y);
}
}
[Serializable]
public class Bar
{
private int a;
private Func<int> b;
public Bar(int a, Func<int> b)
{
this.a = a;
this.b = b;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对象和值的范围会发生什么?由于x是值类型,因此它将按值传递给Bar,因此,不需要对其范围进行任何操作.但是y会发生什么?当实际评估b时,y的值需要保持不变.是不是所有的Foo都会在以后评估y?我只能假设Foo不是GC.
现在让我们说我们将Bar序列化为磁盘,然后再对其进行反序列化.什么实际上被序列化?它是否也将Foo序列化?是什么魔法发生了以便在反序列化后可以评估b?你能解释IL中发生的事情吗?
private static Dictionary<Type, Func<string, object>> _parseActions
= new Dictionary<Type, Func<string, object>>
{
{ typeof(bool), value => {Convert.ToBoolean(value) ;}}
};
Run Code Online (Sandbox Code Playgroud)
以上给出了错误
错误14并非所有代码路径都返回类型为'System.Func <string,object>'的lambda表达式中的值
但是下面的确如此.
private static Dictionary<Type, Func<string, object>> _parseActions
= new Dictionary<Type, Func<string, object>>
{
{ typeof(bool), value => Convert.ToBoolean(value) }
};
Run Code Online (Sandbox Code Playgroud)
我不明白两者之间的区别.我认为example1中的额外大括号是允许我们在anon函数中使用多行,那么为什么它们会影响代码的含义呢?
我需要在我的学生类中实现一个静态方法
public static Comparator<Student> getCompByName()
Run Code Online (Sandbox Code Playgroud)
它为 Student 返回一个新的比较器对象,该对象通过属性“name”比较 2 个 Students 对象。
我创建了我认为正确的东西,但我不确定它是否会像上面给出的要求那样发挥作用。我对比较器很陌生,并且很难使用它们。
public static Comparator<Student> getCompByName()
{
Comparator comp = new Comparator<Student>(){
@Override
public int compare(Student s1, Student s2)
{
return Integer.compare(s1.name.length(), s2.name.length());
}
};
return comp;
}
Run Code Online (Sandbox Code Playgroud)
仅通过阅读上述要求,我不确定我应该比较“名称”的内容,是否是长度,是否相等等等。所以我投入了整数比较。任何人都清楚需要什么以及我是否正确地做到了这一点?如果没有,有人可以让我知道我需要做什么/改变吗?
我知道你不能从方法中返回匿名类型,但我想知道Select扩展方法如何返回匿名类型.它只是一个编译技巧吗?
编辑
假设L是一个列表.这是如何运作的?
L.Select(s => new { Name = s })
Run Code Online (Sandbox Code Playgroud)
返回类型是IEnumerable <'a>其中'a = new {String Name}
C#2.0有一个称为匿名函数的简洁功能.这主要用于事件:
Button.Click += delegate(System.Object o, System.EventArgs e)
{ System.Windows.Forms.MessageBox.Show("Click!"); };
Run Code Online (Sandbox Code Playgroud)
现在,假设Button是一个静态成员,那么向其添加委托将被视为非托管资源.通常,我必须在再次对其进行regestring之前取消注册该处理程序.这是GUI编程的一个非常常见的用例.
匿名函数有哪些指导原则?框架是否自动取消注册?如果是的话,何时?
我不明白以下代码是如何工作的.具体来说,我不明白使用"return i <3".我希望返回i如果它<小于3.我总是认为返回只返回值.我甚至找不到它的语法.
第二个问题,在我看来,使用匿名方法(委托(int i))但是可以用普通委托指向方法else来编写它吗?谢谢
List<int> listOfInts = new List<int> { 1, 2, 3, 4, 5 };
List<int> result =
listOfInts.FindAll(delegate(int i) { return i < 3; });
Run Code Online (Sandbox Code Playgroud) 当我有一个TList(所以,一个"程序参考"列表),并且我清除它时,匿名方法中使用的所有捕获变量都会被释放,所以不会发生泄漏吗?
IE浏览器.是清除TList时有效的引用计数?
我想声明一个通用记录,如下所示:
type
TMyDelegate<T: constraint> = record
private
fDelegate: T;
public
class operator Implicit(a: T): TMyDelegate;
class operator Implicit(A: TMyDelegate: T);
end;
Run Code Online (Sandbox Code Playgroud)
我想限制T到reference to procedure/function.(越多越好).
我试过这个,但它没有编译:
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TProc1 = reference to procedure(a: Integer);
TProc2 = reference to procedure(b: TObject);
TTest<T: TProc1, TProc2> = record
private
fData: T;
public
class operator Implicit(a: T): TTest<T>;
class operator Implicit(a: TTest<T>): T;
end;
{ TTest<T> }
class operator TTest<T>.Implicit(a: T): TTest<T>;
begin
Result.fData:= …Run Code Online (Sandbox Code Playgroud) 我想使用ValueTuple的命名功能如下:
IEnumerable<(string, char, int)> valueTuples = new(string, char, int)[]
{
("First", '1', 1),
("Second", '2', 2),
("Third", '3', 3)
};
var projection1 = valueTuples.Select(((string s, char c, int i) tuple) => tuple.i);
Run Code Online (Sandbox Code Playgroud)
但它不会编译错误消息,这不是很有帮助.然而这些都编译:
var projection2 = valueTuples.Select(tuple => tuple.Item1);
var projection3 = valueTuples.Select(((string, char, int) tuple) => tuple.Item1);
Run Code Online (Sandbox Code Playgroud)
尝试更直接的方法,这不编译BUT提供更有帮助的错误消息:
var projection4 = Enumerable.Select(
valueTuples, ((string s, char c, int i) tuple) => tuple.i);
Run Code Online (Sandbox Code Playgroud)
这导致尝试这个,编译:
var projection5 = Enumerable.Select<(string, char, int), int>(
valueTuples, ((string s, char c, int i) tuple) => …Run Code Online (Sandbox Code Playgroud) c# ×5
delegates ×2
delphi ×2
.net ×1
c#-3.0 ×1
comparator ×1
events ×1
foreach ×1
function ×1
generic-list ×1
generics ×1
ienumerable ×1
java ×1
predicate ×1
scope ×1
syntax ×1
valuetuple ×1