C#可重入函数

SoulRed 2018-03-14 12:14:17
搜了一下百度,没有。。。
只有一些C C++的,不过应该差不多
我整理了下

1.函数不能包括静态变量(包括单例类)
2.函数不能包括全局变量(可包含常量)
3.函数处理的数据只能是传入的参数
4.不能调用其他不可重入的函数。

另外我在看微软orleans框架文档的时候,顺便发现了一句话
Dependency Injection is implement of the invert Of control
依赖注入是控制反转的实现。具体英文我忘了, 大概是这样写的
...全文
863 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2018-03-15
  • 打赏
  • 举报
回复
你说的是函数式编程风格的没有副作用的函数。 简单来说,你说得这么多概括起来就是,一个函数的所有输入参数决定了函数的返回值。 函数式编程风格除了你说的没有副作用的函数,还有如下一些特性 柯里化 高阶函数 所有变量只能在初始化时候一次指定值 惰性求值 等等。 当然了,函数式编程只是一种风格。超越这种风格讨论它的利弊是没有任何意义的。
xuzuning 2018-03-15
  • 打赏
  • 举报
回复
闭包就是能够读取其他函数内部变量的函数 从闭包的定义就可知道闭包是不可重入的,与穿越不穿越无关 闭包是对象,比函数高一个层次
wanghui0380 2018-03-15
  • 打赏
  • 举报
回复
楼上对,函数式领域有讨论的必要 比如js的人们最喜欢讨论的一个话题“闭包与穿越”,当闭包碰上穿越,此闭包就没办法重入了 在我们这里如果遇上重入问题基本也是这类,要么共享资源独占无法重入,要么就是匿名委托共享变量作用域穿越 比如: xxx事件会传递一个id给你,然后实际内部使用匿名委托交给一个“闭包”处理,那么这种东西就要小心处理了。别穿越,别和陌生人说话,匿名委托执行体只应该处理上次传递的id,不能把id共享了,一旦id共享,就无法重入了,下一次过来的值和上次的值就混乱了
qq_16240729 2018-03-15
  • 打赏
  • 举报
回复
点赞
qq_16240729 2018-03-15
  • 打赏
  • 举报
回复
点赞赞赞赞赞赞赞赞
xuzuning 2018-03-14
  • 打赏
  • 举报
回复
不在函数体内缓存数据,不依赖外部资源运行的函数就是可重入函数 外部资源可通过参数传入
bloodish 2018-03-14
  • 打赏
  • 举报
回复
个人理解: 只要处理好函数内部临界资源的访问控制,函数都应该可以重入,不存在绝对无法重入的函数,都是相对的提法。 关于IOC和DI,DI只是IOC的一种实现方式,像反射,工厂模式都可以实现IOC
SoulRed 2018-03-14
  • 打赏
  • 举报
回复
厉害,看了楼上几位的补充,顿时感觉又长高了1cm
wanghui0380 2018-03-14
  • 打赏
  • 举报
回复
至于你后面一个问题,我引用<冒号课堂>一书的一段
引号联想到另一个名词:“我知道有个依赖反转,与控制反转是一回事吗?”

冒号简答:“虽然不少人把它们看成同义词,但依赖反转原则(Dependency-Inversion Principle,简称DIP)更加具体——高层模块不应依赖低层模块,它们都应依赖抽象;抽象不应依赖细节,细节应依赖抽象。经常相提并论的还有依赖注射(Dependency Injection,简称DI)——动态地为一个软件组件提供外部依赖。由于时间关系,不再详加介绍,留待后续。有一点可以看出,它们的主题是控制与依赖,目的是解耦,方法是反转,而实现这一切的关键是抽象接口。”
你可以看到依赖反转原则也是法则原则之一(依赖反转同样是对象设计7大原则之一),而依赖注入也只是依赖反转其中一种实现,毕竟法则是通用的,手段则是各有各的手段
wanghui0380 2018-03-14
  • 打赏
  • 举报
回复
其实你个人总结的那个早就被老外总结了无数遍,而且这个总结无关重入,这个总结是普适定义,就是我上面说的“别和陌生人说话” 当然我是口语表达,这玩意在正式的软件设计书中叫做“迪米特法则 ”,也是对象基础设计的7大法则之一 迪米特法则的原话是“别和陌生人说话,只和朋友圈内部的说话” 而“朋友圈”的界定 1)当前对象本身(this) 2)以参量形式传入到当前对象方法中的对象 3)当前对象的实例变量直接引用的对象 4)当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友 5)当前对象所创建的对象 任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”;否则就是“陌生人”。
wanghui0380 2018-03-14
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
不在函数体内缓存数据,不依赖外部资源运行的函数就是可重入函数 外部资源可通过参数传入
这个正确,其实也就是“别和陌生人说话”原则 当然其实本质上,对程序员来说,任何函数都可以重入。那怕线程级lock都可以重入,只要资源是自己的都可以。比如有如下题目 lock(lock对象) { 尾递归 } 他死锁么?不死锁,lock对象是自己的,只要尾递归能保证退出,他就不死锁。如果说不可重入,第二次尾递归就“疯了”

110,499

社区成员

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

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

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