我已经是一名专业软件工程师,已经有一年的时间了,已经获得了CS学位.我已经知道C++和C中有一段时间的断言,但直到最近才知道它们在C#和.NET中存在.
我们的生产代码不包含任何断言,我的问题是......
我应该在生产代码中开始使用Asserts吗?如果是这样,它的使用何时最合适?这样做会更有意义吗?
Debug.Assert(val != null);
Run Code Online (Sandbox Code Playgroud)
要么
if ( val == null )
throw new exception();
Run Code Online (Sandbox Code Playgroud) language-agnostic testing defensive-programming exception assertions
我刚刚注意到Dictionary.TryGetValue(TKey key, out TValue value)并且很好奇哪个是从Dictionary中检索值的更好方法.
我传统上做了:
if (myDict.Contains(someKey))
someVal = myDict[someKey];
...
Run Code Online (Sandbox Code Playgroud)
除非我知道它有必要在里面.
做的更好:
if (myDict.TryGetValue(somekey, out someVal)
...
Run Code Online (Sandbox Code Playgroud)
哪种更好的做法?一个比另一个快吗?我会想象Try版本会慢一些,因为它'swallowing'是一个try/catch本身并将其用作逻辑,不是吗?
是否可以在C#中定义一个类
class GenericCollection<T> : SomeBaseCollection<T> where T : Delegate
Run Code Online (Sandbox Code Playgroud)
我无法为我的生活在.NET 3.5中完成这一切.我试过用
delegate, Delegate, Action<T> and Func<T, T>
在我看来,这应该是允许的某种方式.我正在尝试实现自己的EventQueue.
我最终只是这样做[原始近似注意你].
internal delegate void DWork();
class EventQueue {
private Queue<DWork> eventq;
}
Run Code Online (Sandbox Code Playgroud)
但是后来我失去了为不同类型的函数重用相同定义的能力.
思考?
在我目前的工作中,我们正在寻求实现我们自己的odbc驱动程序,以允许许多不同的应用程序能够连接到我们自己的应用程序作为数据源.现在我们正在尝试权衡开发我们自己的驱动程序到实现规范的选项,这是大规模的,或者使用SDK,允许程序员"填写"特定于数据的部分并允许更高级别的抽象.
有没有其他人实现自定义odbc驱动程序?你遇到了什么陷阱?你自己做了什么好处?花了多少工时呢?您是否使用过SDK?如果是这样,您从该方法中看到了哪些好处/缺点?
任何评论和答案将不胜感激.谢谢!
编辑:我们正在尝试使用我们的代码来维护可移植性,这是用C语言编写的.
我正在思考函数式语言可以更直接地绑定到他们的硬件的方式,并且想知道垃圾收集的任何硬件实现.
这会显着加快速度,因为硬件本身会隐式处理所有集合,而不是某些环境的运行时.
这是LISP机器做的吗?有没有进一步研究这个想法?这个域名是否具体?
思考?异议?讨论.
我正在使用一些流行的python包作为基础,为图形和网络开发一个开源近似算法库.主要目标是在图形和网络上包含NP-Complete问题的最新近似算法.原因是1)我还没有看到一个很好的(现代)整合软件包来涵盖这个和2)它将是一个很好的教学工具,用于学习NP-Hard优化问题的近似算法.
在构建这个库时,我使用单元测试来进行健全性检查(正如任何适当的开发人员所做的那样).我对我的单元测试有些谨慎,因为它们本质上是近似算法可能无法返回正确的解决方案.目前我正在手工解决一些小实例,然后确保返回的结果与之匹配,但这在实现意义上是不可取的,也不是可扩展的.
单元测试近似算法的最佳方法是什么?生成随机实例并确保返回的结果小于算法保证的界限?这似乎有误报(测试时间很幸运,并不能保证所有实例都低于限制).
我希望用匿名委托和lambda表达式清除一些东西,用于为C#中的事件处理程序创建一个方法,至少对我自己来说.
假设我们有一个事件添加一个匿名委托或一个lambda表达式(对于那些可以使用较新版本.NET的幸运人群).
SomeClass.SomeEvent += delegate(object o, EventArg e) { /* do something */ };
Run Code Online (Sandbox Code Playgroud)
我已经读过,过去的人们已经忘记了仍然有处理程序的事件,这些处理程序会阻止类被垃圾收集.如何在不在类中将SomeEvent设置为null的情况下删除添加的处理程序.以下不是一个全新的处理程序吗?
SomeClass.SomeEvent -= delegate(object o, EventArg e) { /* do something */ };
Run Code Online (Sandbox Code Playgroud)
我可以看到将匿名委托或lambda表达式存储在变量中.但至少对我而言,这似乎打败了能够简单而简洁地添加事件处理程序的全部目的.
SomeEventDelegate handler = new SomeEventDelegate(delegate(object o, EventArg e) { /* do something */ });
SomeClass.SomeEvent += handler;
// ... stuff
SomeClass.SomeEvent -= handler;
Run Code Online (Sandbox Code Playgroud)
我再次理解你可以......
public override Dispose(bool disposing)
{
_someEvent = null;
this.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是我只是从事件中删除动态创建的方法更有趣.希望有人可以为我揭开这一点.谢谢!
我正在开发一个松散耦合的集群来进行一些数据处理.网络代码和处理代码已经到位,但我们正在评估我们方法中的不同方法.现在,正如我们应该的那样,我们在性能问题上受到I/O限制,我们正试图减少这个瓶颈.显然,像Infiniband这样的更快的交换机会很棒,但是我们无法承受抛弃我们所拥有的东西并获得新设备的奢侈品.
我提出的问题是这个.在群集上完成的所有传统和严重的HPC应用程序通常通过消息传递与直接通过套接字发送来实现.这对性能有什么好处?如果我们从套接字切换,我们应该看到加速吗?
我正在为松散耦合的集群开发一些代码.为了在作业期间实现最佳性能,每次孩子进入或退出时,我都会重新映射其数据.这最终将成为可选的,但是现在它默认执行数据平衡.我的平衡基本上只是确保每个孩子的每台机器的平均文件数量不超过一个.如果除法不干净,则加上余数.并且由于其余部分总是小于儿童数量[除了0例,但我们可以排除],平衡后的儿童最多只有平均值+ 1.
一切似乎都很好,直到我意识到我的算法是O(n!).沿着孩子的名单,找出平均值,余数,谁太多,谁太少.对于列表太多的每个孩子,请通过列表,发送给每个孩子太少.
有更好的解决方案吗?我觉得一定有.
编辑:这是一些伪造的代码来展示我如何派生O(n!):
foreach ( child in children ) {
if ( child.dataLoad > avg + 1 ) {
foreach ( child2 in children ) {
if ( child != child2 && child2.dataLoad < avg ) {
sendLoad(child, child2)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:O(n ^ 2).Foreach n,n => n*n => n ^ 2.我想我今天早上没有足够的咖啡!;)
在未来,我想转向一种更灵活,更有弹性的分配方法[权重和数据],但是现在,统一的数据分布工作.
在.NET中,似乎有两种方法可以将类型传递给方法或类.第一种是通过泛型,我们将类型作为特殊参数传递.
如:
var list = new List<MyClass>();
Run Code Online (Sandbox Code Playgroud)
另一种方法是明确使用typeof运算符,例如:
var pe = Expression.ParameterExpression(typeof(MyClass), "myinstance");
Run Code Online (Sandbox Code Playgroud)
我的问题是关于需要类型参数的方法的统一接口的差异.为什么上述陈述不能如下做?:
var pe = Expression.ParameterExpression<MyClass>("myinstance");
Run Code Online (Sandbox Code Playgroud)
是因为编译器的行为方式需要两个语义差异吗?当编译器处理泛型参数时,它只是执行替换ala lambda演算吗?尽管typeof风格方法要求的实际实例Type类来推断属性和特性?
谢谢.
c# ×3
.net ×2
algorithm ×2
delegates ×2
events ×2
generics ×2
assertions ×1
big-o ×1
c ×1
c++ ×1
constraints ×1
database ×1
dictionary ×1
exception ×1
graph-theory ×1
hardware ×1
hpc ×1
lambda ×1
np ×1
odbc ×1
odbc-bridge ×1
sdk ×1
sql ×1
testing ×1
typeof ×1
unit-testing ×1