c# 新手 语法问题

myndsc2009 2011-01-21 10:06:43
例:

public static void On(TimeSpan fromSeconds, Action action)
{
DispatcherTimer t = new DispatcherTimer() { Interval = fromSeconds };
t.Tick += (s, args) =>
{
action();
t.Stop();
};
t.Start();

}


我原来是学 C++的 对于C#的语法有很多不理解,等待老手给予解答。
1. 发现C#的事件触发都用 “+=”,它的意思是什么,代表委托么?
2. 对于本代码中的 “=>”应该如何理解
3. 对于c#中 出现的 get set 应该如何理解,是方法么?
4. 求助关于本代码段的解析..
...全文
209 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxbd123 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jorln 的回复:]

1. 发现C#的事件触发都用 “+=”,它的意思是什么,代表委托么?
t.Tick += (s, args) =>
等同于
t.Tick = t.Tick + (s, args) =>
[/Quote]
。。。。。。。。。。。。。。。。
myndsc2009 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yizhili 的回复:]
引用 12 楼 hztltgg 的回复:
public static void On(TimeSpan fromSeconds, Action action)
一个全局静态方法On,参数fromSeconds是TimeSpan类型,就是时间间隔类型,1小时,10秒等。action就是一个Action类型,是一个委托类型,相当于c++的函数指针类型,可以传递一个方法过来。
{
D……

……
[/Quote]
十份感谢, 呵呵 ,没多一份 回答我都学到很多。。灰常感谢。。
yizhili 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hztltgg 的回复:]
public static void On(TimeSpan fromSeconds, Action action)
一个全局静态方法On,参数fromSeconds是TimeSpan类型,就是时间间隔类型,1小时,10秒等。action就是一个Action类型,是一个委托类型,相当于c++的函数指针类型,可以传递一个方法过来。
{
D……
[/Quote]

补充一点:
虽然对于变量和属性,a += b 等价于 a = a + b,但对于事件并非如此
在定义事件的类型之外,你只能执行两个操作:通过 += 注册事件处理函数,通过 -= 取消注册的处理函数
因此“Application.Current.Exit = Application.Current.Exit + new EventHandler(HandleApplicationExit);”会编译错误
+= 就是用来告诉事件,发生的时候要掉这么个函数来处理

至于委托,正如12楼所说:
“委托类型,相当于c++的函数指针类型,可以传递一个方法过来”
请叫我涛哥0-0 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jorln 的回复:]

1. 发现C#的事件触发都用 “+=”,它的意思是什么,代表委托么?
t.Tick += (s, args) =>
等同于
t.Tick = t.Tick + (s, args) =>


2. 对于本代码中的 “=>”应该如何理解

在 C# 中,=> 是 lambda 运算符,可读为“goes to”。
具体参见http://msdn.microsoft.com/zh……
[/Quote]
7楼的说的很再行,我就第一点在补充一下:
"+="是事件的运算符,委托做了次封装就成了事件。
例:

delegate int D();
D d = Method1();//Method1,Method2都是方法
d += Method2();
...

delegate Event D;
D eventD += Metod1();
eventD += Method2()
...
c157035135 2011-01-21
  • 打赏
  • 举报
回复
(s, args) =>
是lamda表达式的写法,相当于一个匿名函数
myndsc2009 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hztltgg 的回复:]
引用 11 楼 myndsc2009 的回复:
C# code

Application.Current.Exit += new EventHandler(HandleApplicationExit);



Application.Current.Exit = Application.Current.Exit + new EventHandler(HandleApplication……
[/Quote]

多谢..
myndsc2009 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hztltgg 的回复:]
public static void On(TimeSpan fromSeconds, Action action)
一个全局静态方法On,参数fromSeconds是TimeSpan类型,就是时间间隔类型,1小时,10秒等。action就是一个Action类型,是一个委托类型,相当于c++的函数指针类型,可以传递一个方法过来。
{
DispatcherTimer t = new D……
[/Quote]

解答的很详细,十份感谢 ,呵呵,还要看书 ,对 委托还不是很理解.. 委托可以看成是交给.net 去处理的事件吧?
这段代码还是融合很多知识的 多谢.. 同样感谢其他朋友的关心。。jorln 的解答也帮助我很多
hztltgg 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 myndsc2009 的回复:]
C# code

Application.Current.Exit += new EventHandler(HandleApplicationExit);



Application.Current.Exit = Application.Current.Exit + new EventHandler(HandleApplicationExit);
可以这样理解么? 疑惑中。
[/Quote]

和数值计算的+=不同,重载过了,是表示委托链的追加委托方法,这两个类型不同,不是直接加的,加了也没意义。

事件里有一个列表,+=表示增加一个事件处理程序。=就把之前加的给清除了
hztltgg 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sunlongchina 的回复:]
对于c#中 出现的 get set 应该如何理解,是 字段封装 拆箱和装箱
[/Quote]

和 拆箱和装箱 没什么关系, 拆箱和装箱是值类型和引用类型的转换

get set 只是表示这是一个属性,本质就是通过公开方法访问内部字段而已。
hztltgg 2011-01-21
  • 打赏
  • 举报
回复
public static void On(TimeSpan fromSeconds, Action action)
一个全局静态方法On,参数fromSeconds是TimeSpan类型,就是时间间隔类型,1小时,10秒等。action就是一个Action类型,是一个委托类型,相当于c++的函数指针类型,可以传递一个方法过来。
{
DispatcherTimer t = new DispatcherTimer() { Interval = fromSeconds };
定义t变量,类型DispatcherTimer ,是一个定时器组件,并new 出一个实例赋值给他,设置定时周期属性interval为传递过来的值
t.Tick += (s, args) =>
{
action();
t.Stop();
};
Tick是DispatcherTimer的一个事件,事件是委托类型,.net的委托是链,可以一个接一个的委托,每个事件最后都去看看还有事件要处理,所以这儿重载了+=运算符,表示是增加一个事件处理,用=也行,但这样另外是事件处理程序就没的处理了。
(s, args) =>
{
action();
t.Stop();
};
这是一种新语法,就是一个匿名函数,=>前面的是参数,后面的方法体。整个表达式就是一个委托了,就是一个函数,c#可以直接在用的地方定义函数,而不用在另外的地方定义,然后用函数名来引用,这样对于一次性的函数还是很方便的。
这个函数体的内容就是执行传递给他的那个方法,并停止定时器。

t.Start();
这个就没什么了,new出来就开始计时
}



myndsc2009 2011-01-21
  • 打赏
  • 举报
回复

Application.Current.Exit += new EventHandler(HandleApplicationExit);


Application.Current.Exit = Application.Current.Exit + new EventHandler(HandleApplicationExit);
可以这样理解么? 疑惑中。
sunlongchina 2011-01-21
  • 打赏
  • 举报
回复
对于c#中 出现的 get set 应该如何理解,是 字段封装 拆箱和装箱
sunlongchina 2011-01-21
  • 打赏
  • 举报
回复
msdn 楼主装没 去看下就一切 简单了
evolve724 2011-01-21
  • 打赏
  • 举报
回复
找本c#高级编程来看 就全明白啦
莫名其 2011-01-21
  • 打赏
  • 举报
回复
1. 发现C#的事件触发都用 “+=”,它的意思是什么,代表委托么?
t.Tick += (s, args) =>
等同于
t.Tick = t.Tick + (s, args) =>


2. 对于本代码中的 “=>”应该如何理解

在 C# 中,=> 是 lambda 运算符,可读为“goes to”。
具体参见http://msdn.microsoft.com/zh-cn/library/bb397687(v=VS.90).aspx


3. 对于c#中 出现的 get set 应该如何理解,是方法么?

get取值,set赋值。
具体参见:http://kb.cnblogs.com/page/50502/
hanzhehanzhe 2011-01-21
  • 打赏
  • 举报
回复
LINQ的新语法
myndsc2009 2011-01-21
  • 打赏
  • 举报
回复
对这个 => 实在是不理解 += 还可以依稀猜出 是触发事件。
wdywqc 2011-01-21
  • 打赏
  • 举报
回复
=> 语法是新出来的,以前也没有,linq的新特性...其实学c#的如果不看书的话,也不知道是什么意思
myndsc2009 2011-01-21
  • 打赏
  • 举报
回复
c++的语法 还蛮好懂得 就那么几种.. 刚接触C#有点晕
anbin0814 2011-01-21
  • 打赏
  • 举报
回复
=>是linq的写法
加载更多回复(1)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧