许多常见的文件系统不提供原子操作,但是在某些情况下以原子方式写入文件非常重要。我试图为这个问题提出解决方案。
我做了以下假设:
这就留下了以下问题:写入文件时,程序可能会中断,并且文件中只剩下部分内容要写入。
我提出以下过程:
新建文件和备份文件与原始文件是有区别的(例如,它们的前缀可以不同,或者可以在同一卷上的单独目录中)。同时,它们的名称应直接映射到相应的原始名称(例如,只需使用相同的文件名)。
但是,这还不能使操作原子化。该过程可能会中断步骤1、2、3或4:
使用先前的假设2和3,程序必须在崩溃后重新启动。在启动过程中,它应执行以下恢复检查:
仅使用原子操作的恢复过程本身将在中断后继续从中断处继续进行。
我相信这个想法可以确保对单个程序进行原子写入。这些问题仍然存在:
可以通过使用策略(例如,检查其他实例,并拒绝对其他用户的目录访问)来解决这些问题(先前的假设未包括在内)。
最后,我的问题是:这样做有意义吗,或者过程中存在缺陷?是否有任何问题阻止这种方法在实践中使用?
关于readonlyC#提及的C++等价物有很多问题const.然而,到目前为止,我发现没有,据我所知,实际上是正确的,甚至没有提到我在此之后的细节.
可以在ctor(spec)中设置只读字段(甚至多次).这允许在最终确定值之前执行各种操作.另一方面,C++中的Const的行为略有不同(在C++和C#中),因为它需要在ctor运行之前使最终值可用.
有没有办法仍然实现readonlyC++ 的行为?
我正在考虑使用BigInteger类来存储10-1000 MB范围内的数字.有任何人对此有经验吗?极大数字是否有实际或隐含的限制?
在这个可变链表实现中,没有Ref{ListNode{T}}:
mutable struct ListNode{T}
data::T
prev::ListNode{T}
next::ListNode{T}
end
Run Code Online (Sandbox Code Playgroud)
要编辑列表,它使用类似 的代码next.prev = prev。
我通常的理解是结构体被嵌入到位(就像 C 中的那样)。这不允许在不完全重新创建列表的情况下编辑列表。要拥有指向结构的引用/指针,可以使用Ref{ListNode{T}}.
从代码来看,这种理解显然是错误的:prev::ListNode{T}已经是一个可以轻易改变的指针了。但我不明白为什么会这样。Julia 中的结构默认嵌入为指针吗?可能只有它们是可变的?
我在文档中找不到该行为的具体描述。它讨论了堆/堆栈分配,但没有讨论直接分配与指针分配的更基本问题。
我想知道在C#中实现正确,灵活和快速Equals的最佳方法,几乎可以用于任何类和情况.我认为性能需要专门的Equals(将实际类的对象作为参数).为了避免代码重复,一般Equals应该调用专门的Equals.即使在继承的类中,也应该只执行一次空检查.
我终于想出了这个设计:
class MyClass
{
public Int32 SomeValue1 = 1;
public Int32 SomeValue2 = 25;
// Ignoring GetHashCode for simplicity.
public override bool Equals(object obj)
{
return Equals (obj as MyClass);
}
public bool Equals(MyClass obj)
{
if (obj == null) {
return false;
}
if (!SomeValue1.Equals (obj.SomeValue1)) {
return false;
}
if (!SomeValue2.Equals (obj.SomeValue2)) {
return false;
}
return true;
}
}
class MyDerivedClass : MyClass
{
public Int32 YetAnotherValue = 2;
public …Run Code Online (Sandbox Code Playgroud) 如何从Visual Studio 2008代码指标中排除生成的代码(如Windows窗体设计器相关代码)?
我一直在挖掘,但我没有找到任何解决方案.DebuggerHidden并DebuggerNonUserCode没有任何效果.
这个简单的任务给我带来了一些麻烦.我只想让用户输入任何成功float.TryParse进入Textboxish控件的文本.
我可以使用普通的TextBox并检查一些btnOK_Click中的Text,但这显然很蹩脚.此外,有一个很好的内置MaskedTextBox控件,但我没有设置它的掩码等于float.TryParse.此外,它似乎仅在发生焦点变化时检查有效性.
在网上挖掘带来了一些有趣的想法,但没有一个像我想的那样好.
你是怎么解决这个问题的?我是否只是错过了一个明显的解决方案,还是我必须自己实现这个功能?
我知道SO上有一些类似的线程,但没有找到可行的解决方案.
更新:是的,WinForms.
我想拆分这样的字符串:
abc//def//ghi
Run Code Online (Sandbox Code Playgroud)
在第一次出现之前和之后的一部分//:
a: abc
b: //def//ghi
Run Code Online (Sandbox Code Playgroud)
我正在使用这个正则表达式:
(?<a>.*?)(?<b>//.*)
Run Code Online (Sandbox Code Playgroud)
到目前为止哪个工作正常.
但是,有时候//源字符串中缺少了这一点,显然正则表达式无法匹配.如何使第二组可选?
abc类似的输入应匹配:
a: abc
b: (empty)
Run Code Online (Sandbox Code Playgroud)
我尝试(?<a>.*?)(?<b>//.*)?但是在Expresso中留下了很多NULL结果,所以我猜这是错误的想法.
对不起,奇怪的标题.我想要实现的目标很简单:
IEnumerable<IEnumerable<Foo>> listoflist;
IEnumerable<Foo> combined = listoflist.CombineStuff();
Run Code Online (Sandbox Code Playgroud)
例:
{{0, 1}, {2, 3}} => {0, 1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
我很肯定有一个Linq表达式...
旁注:列表可能很大.
我没有看到这个代码有任何问题,但感觉我错过了一些东西.也许可以减少行数.或者甚至有一个错误需要修复?我愿意接受任何建议.
public class NameComparer : IEqualityComparer<FileInfo>
{
public bool Equals (FileInfo x, FileInfo y)
{
if (x == null) {
return y == null;
}
if (y == null) {
return false;
}
return x.Name.Equals (y.Name);
}
public int GetHashCode (FileInfo obj)
{
return obj.Name.GetHashCode ();
}
}
Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×1
atomicity ×1
biginteger ×1
c++ ×1
code-metrics ×1
const ×1
constructor ×1
equals ×1
file-io ×1
filesystems ×1
ienumerable ×1
julia ×1
linked-list ×1
linq ×1
null ×1
readonly ×1
regex ×1
textbox ×1
transactions ×1
validation ×1