使用静态Object.Equals检查null的代码是否比使用==运算符或常规Object.Equals的代码更健壮?是不是后两种易受这样一种方式,检查空预期不工作正在被超越(如返回false时,比较值是零)?
换句话说,是这样的:
if (Equals(item, null)) { /* Do Something */ }
Run Code Online (Sandbox Code Playgroud)
比这更强大:
if (item == null) { /* Do Something */ }
Run Code Online (Sandbox Code Playgroud)
我个人觉得后面的语法更容易阅读.编写处理作者控件之外的对象的代码(例如库)时应该避免吗?是否应始终避免(检查为空时)?这只是头发分裂吗?
我正在开始一个普通C(c99)的新项目,该项目主要用于文本.由于外部项目的限制,这段代码必须非常简单和紧凑,由一个没有外部依赖的源代码文件或除libc和类似的无处不在的系统库之外的库组成.
根据这种理解,哪些最佳实践,陷阱,技巧或其他技术可以帮助使项目的字符串处理更加健壮和安全?
我们的产品是分布式系统.我工作的模块相当新,非常严格,经过严格测试.它们是根据最近的最佳实践开发的.其他模块可以视为传统软件.
虽然我对我负责的模块中发生的所有事情保持警惕,但我仍然面临着处理从其他模块发送给我的不良数据的压力.从本质上讲,我是一个"快速失败"原则的开发人员,因此,当问题出现时,我通常能够消除模块中出错的可能性.这不仅仅是责备,只是在错误的地方浪费精力去追逐虫子.
但我不断反对的论点是:"我们不能让这些东西在生产中失败,客户希望这个能够发挥作用,为什么你不解决这个问题".这将是一个强大的论据:你接受的是自由的,你发送的是保守的.
我还应该注意到,这些主要是间歇性的问题.我们在集成测试中看到它们,但它们很难重现.涉及时间和并发.
我很难在这两个原则之间取得平衡.部分原因是我担心,如果我开始允许和传播特殊数据,我会引起麻烦,我对系统的信心也不会那么高.但即使其他模块向我发送错误的数据,我也不能反对保持系统正常工作.其他模块没有得到修复的原因是它们太复杂和脆弱,而我的仍然显得清晰和安全.但是,如果我不抵抗压力,我的模块将慢慢地背负着我一直拒绝的同样问题.
我应该说系统没有在生产中"崩溃",但是我的模块可能只是向操作员显示错误并要求他们联系支持人员.崩溃将是一个大问题,但如果我清楚地报告错误,那么这不是正确的做法吗?我怀疑我的同行只是不希望客户看到任何问题,期间.但是我的模块拒绝了我们产品中其他模块的数据,而不是客户输入.所以在我看来,我们只是没有解决问题.
那么,我是否需要更务实或坚持自己的立场?
我在处理事件期间编写了一个处理事件和未捕获异常的服务器,不得终止服务器.
服务器是一个单线程的非线程python.
我想终止这些错误类型:
内置异常列表很长:https://docs.python.org/2/library/exceptions.html
我不想重新发明这个异常处理,因为我猜它以前做了好几次.
如何进行?
提示:这个问题不是关于在后台运行unix守护进程.它不是关于双叉而不是关于重定向stdin/stdout :-)
我在尝试使用Stata后学习R,我必须说我喜欢它.但现在我遇到了一些麻烦.我即将对Panel Data进行一些多次回归,因此我正在使用该plm软件包.
现在我想plm在R中获得与我使用lm函数和Stata时相同的结果,当我执行异方差性稳健和实体固定回归时.
比方说,我有一个变量面板数据集Y,ENTITY,TIME,V1.
我用这段代码在R中得到了相同的标准错误
lm.model<-lm(Y ~ V1 + factor(ENTITY), data=data)
coeftest(lm.model, vcov.=vcovHC(lm.model, type="HC1))
Run Code Online (Sandbox Code Playgroud)
就像我在Stata中执行此回归一样
xi: reg Y V1 i.ENTITY, robust
Run Code Online (Sandbox Code Playgroud)
但是,当我使用plm包执行此回归时,我得到其他标准错误
plm.model<-plm(Y ~ V1 , index=C("ENTITY","YEAR"), model="within", effect="individual", data=data)
coeftest(plm.model, vcov.=vcovHC(plm.model, type="HC1))
Run Code Online (Sandbox Code Playgroud)
plm模型是否使用其他类型的估计,如果是,如何?plm与Stata 相同的标准错误, robust 我有一个以下方法连接到程序启动时的终点
ChannelSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var remoteIpAddress = IPAddress.Parse(ChannelIp);
ChannelEndPoint = new IPEndPoint(remoteIpAddress, ChannelPort);
ChannelSocket.Connect(ChannelEndPoint);
Run Code Online (Sandbox Code Playgroud)
我还有一个定时器,设置为每60秒触发一次CheckConnectivity,它会尝试将任意字节数组发送到终点,以确保连接仍然存在,如果发送失败,它将尝试重新连接.
public bool CheckConnectivity(bool isReconnect)
{
if (ChannelSocket != null)
{
var blockingState = ChannelSocket.Blocking;
try
{
var tmp = new byte[] { 0 };
ChannelSocket.Blocking = false;
ChannelSocket.Send(tmp);
}
catch (SocketException e)
{
try
{
ReconnectChannel();
}
catch (Exception ex)
{
return false;
}
}
}
else
{
ConnectivityLog.Warn(string.Format("{0}:{1} is null!", ChannelIp, ChannelPort));
return false;
}
return true;
}
private …Run Code Online (Sandbox Code Playgroud) 我最近用我编写的shell脚本擦除了我的主目录的一部分.幸运的是,我确实击中了Ctrl- C足够快以避免最坏的情况.
我的错误在于过分依赖相对路径.从现在开始,我总是在更改目录时使用绝对路径...但是,它引出了一个有趣的问题:编写健壮的shell脚本有哪些规则?
我已经知道,当从目录移动到另一个目录时,应始终使用绝对路径.但是,必须有很多其他的(例如,当命令失败时该怎么做,什么是停止脚本并告知用户有关它的好方法).
那么,有没有人有一个专门针对shell脚本的规则和提示的列表?
我正在构建一个使用System.IO.File.Copy(...)函数复制文件的服务器应用程序.我的文件可能相当大,因此,如果机器崩溃,它很有可能在复制期间发生.
重新启动服务后,我应该能够获取复制任务并继续.如何检测服务器崩溃是否成功完成或中断了副本?
我目前的计划是将文件复制到临时名称,复制完成后将其重命名为最终名称.这样,文件命名能够在崩溃时携带状态信息.
你有什么好的/更好的建议吗?
编辑:目标操作系统是Win2003,因此事务NTFS不可用
我只是碰上了这个问题有关初始化局部变量.许多答案都争论简单/可读性与稳健性.作为(远程部署)嵌入式系统的开发者,我总是喜欢稳健性,并倾向于遵循几个看似相互冲突的规则:
以允许设备继续运行的方式尽可能地处理每个错误.
在编程或致命错误发生后,尽快将代码设计为失败.
我们都经过培训,可以验证输入,防止设备因用户(或其他外部)输入而损坏; 总是假设数据可能无效并相应地进行测试.
您还遵循哪些其他具体做法来确保稳健性? 示例很有帮助,但我也对普遍适用的技术感兴趣.
我正在研究一个性能关键的动态链接库(DLL),它也应该具有相对较小的二进制大小.由于它没有显式抛出任何异常,我想完全禁用异常支持.但是,有一个例外(双关语无意):当内存不足(OOM)时,我必须向应用程序报告错误代码,以便它有机会正常处理事情.代码库太大,无法单独检查每个分配并传播错误,并包含我不应该触及的外部代码.所以我想在DLL的导出函数中捕获OOM异常.
快速测试表明,在Visual C++ 2010中禁用C++异常时(即没有/ EHa,/ EHsc或/ EHs标志),在分配太多内存时,它仍会跳转到catch(std :: bad_alloc&)块.
所以它似乎按预期工作.但是,我收到以下1级警告:"C4530:使用了C++异常处理程序,但未启用展开语义.指定/ EHsc".MSDN说"在帧中自动存储的对象,在执行throw的函数和捕获throw的函数之间,不会被破坏".
究竟我会在这里失去什么?只要通过库创建的任何内容都可以删除,并且应用程序可以重新开始(如果它选择的话),可以将事物保留在未定义状态.是否存在无法恢复的内存泄漏风险?
DLL是否使用单独的内存池?如果是这样,我可以清除它而不需要应用程序卸载DLL吗?我可以轻松地让我的库忽略任何进一步(导出)函数调用,直到应用程序执行重新初始化.
谢谢你的建议.