每个WPF开发人员应该知道什么?
入门级
中级
前辈
还有其他"技巧"问题吗?
您希望您的WPF开发人员知道混合吗?
我偶尔会对概念上有状态的组件做出反应,我想重置它们.理想的行为相当于删除旧组件并读取新的原始组件.
React提供了一种方法setState
,允许设置组件自己的显式状态,但不包括隐式状态,如浏览器焦点和表单状态,并且它还排除其子级的状态.抓住所有间接状态可能是一个棘手的任务,我宁愿严格而完全地解决它,而不是每一个令人惊讶的新状态都在玩捣蛋.
是否有API或模式来执行此操作?
编辑: 我做了一个简单的例子来演示这种this.replaceState(this.getInitialState())
方法并将其与方法进行对比this.setState(this.getInitialState())
:https://jsfiddle.net/emn13/kdrzk6gh/ - replaceState
更强大.
如果我有两个DirectoryInfo
对象,我如何比较它们的语义相等?例如,以下路径应全部视为等于C:\temp
:
C:\temp
C:\temp\
C:\temp\.
C:\temp\x\..\..\temp\.
以下可能等于或不等于C:\temp
:
\temp
如果当前工作目录在驱动器上 C:\
temp
如果当前工作目录是 C:\
C:\temp.
C:\temp...\
如果考虑当前的工作目录很重要,我可以自己解决这个问题,所以这并不重要.尾随点在窗口中被剥离,因此这些路径确实应该相等 - 但它们不会在unix中被剥离,所以在mono下我会期望其他结果.
区分大小写是可选的.路径可能存在也可能不存在,用户可能拥有或可能没有路径权限 - 我更喜欢快速健壮的方法,不需要任何I/O(所以没有权限检查),但是如果有什么内置的话 - 我对任何"足够好"的东西都很满意......
我正在尝试处理一个文件列表,这些文件可能是也可能不是最新的,可能存在也可能不存在.在这样做时,我需要解析项目的完整路径,即使该项目可能使用相对路径指定.但是,Resolve-Path
与不存在的文件一起使用时会出现打印和错误.
例如,什么是最简单的化解,干净的方式".\newdir\newfile.txt"
来"C:\Current\Working\Directory\newdir\newfile.txt"
使用PowerShell?
请注意,System.IO.Path
静态方法与进程的工作目录一起使用 - 这不是powershell的当前位置.
在C#中,超类的静态成员被"继承"到子类范围中.例如:
class A { public static int M() { return 1; } }
class B : A {}
class C : A { public new static int M() { return 2; } }
[...]
A.M(); //returns 1
B.M(); //returns 1 - this is equivalent to A.M()
C.M(); //returns 2 - this is not equivalent to A.M()
Run Code Online (Sandbox Code Playgroud)
现在,你不能继承静态类,我唯一可以想象静态继承可能重要的地方完全忽略它:尽管你可以创建一个通用约束,它需要一个类型参数T
作为子类A
,你仍然无法调用T.M()
(这可能简化了VM的事情,更不用说M
在子类中编写不同的实现并使用它.
因此,静态成员的"继承"仅仅看起来像命名空间污染; 即使你明确限定名称(即B.M
)A
的版本仍然解决.
编辑与命名空间的比较:
namespace N1{ class X(); }
namespace N1.N2 …
Run Code Online (Sandbox Code Playgroud) 我有一组接口,用于与特定的可变对象紧密结合.
该对象的许多用户只需要能够从对象中读取值,然后只需要几个属性.为了避免命名空间污染(更容易智能感知)和跨越使用意图,我希望有一个小的基本接口,它只以只读方式暴露一些"关键"属性.
但是,几乎所有实现都将支持完整的界面,其中包括可修改性.
不幸的是,我遇到了在C#中表达这个概念的障碍:
interface IBasicProps {
public int Priority { get; }
public string Name {get;}
//... whatever
}
interface IBasicPropsWriteable:IBasicProps {
public int Priority { set; } //warning CS0108: [...] hides inherited member [...]
public string Name { set; }
//... whatever
}
Run Code Online (Sandbox Code Playgroud)
我当然不打算隐藏任何成员,所以不好!
当然,我可以使用方法解决这个问题,但是什么是正确的选择?我想保持"核心"接口尽可能小,即使分割接口除了传递意图之外没有任何其他目的.在拆分接口,它只是真的很明显哪些方法不会做任何更新,这让编写代码更清楚一点(何况还可以很好的正简单的静态单存根足够了好几个简单的情况下) .
我想避免任何抽象类等; 他们重新实现或快速单一用途垫片更复杂和难以理解.
那么,想法?
在F#脚本文件(.fsx)中,如何确定当前正在执行的.fsx文件的位置?我想解决相对于它的路径.
我试过,Assembly.GetExecutingAssembly().CodeBase
但显然不适用于"动态组装".
以下两行都相同.但是有什么隐藏的区别吗?应该首选哪一个?
Thread t1 = new Thread(aMethod);
Thread t2 = new Thread(new ThreadStart(aMethod));
Run Code Online (Sandbox Code Playgroud)
谢谢.
基本上NUnit,xUnit,MbUnit,MsTest等具有类似于以下的方法:
Assert.IsGreater(a,b)
//or, a little more discoverable
Assert.That(a, Is.GreaterThan(b))
Run Code Online (Sandbox Code Playgroud)
但是,内置的这种比较运算符数量有限; 并且他们不必要地复制语言运算符.当我想要任何稍微复杂的东西时,比如...
Assert.That(a.SequenceEquals(b))
Run Code Online (Sandbox Code Playgroud)
我经常要么继续挖掘手册以找到NUnit-speak中表达式的等价物,要么被迫回退到具有较少有用错误消息的普通布尔断言.
但是,C#与任意表达式很好地集成 - 因此应该可以使用具有以下签名的方法:
void That(Expression<Func<bool>> expr);
Run Code Online (Sandbox Code Playgroud)
这种方法既可用于执行测试(即验证断言),也可用于在测试失败时提供不太透明的诊断; 毕竟,表达式可以呈现为伪代码,以指示哪个表达式失败; 通过一些努力,您甚至可以智能地评估失败的表达式,以提供子表达式值的一些线索.
例如:
Assert.That(()=> a == b);//could inspect expression and print a and b
Assert.That(()=> a < b && b < c);
//could mention the values of "a<b" and "b<c" and/or list the values of a, b, and c.
Run Code Online (Sandbox Code Playgroud)
至少,它会使表达式的并行语言变得不必要,并且在某些情况下,它可能使失败消息更有用.
这样的事情存在吗?
编辑: 在尝试(并且喜欢!)Power Assert之后,我最终重新实现它以解决一些限制.我的变体发表为ExpressionToCode ; 请参阅下面的答案以获取改进列表.
我有一个程序需要重复计算数据集的近似百分位数(顺序统计),以便在进一步处理之前删除异常值.我目前正在通过对值数组进行排序并选择适当的元素来实现这一目标; 这是可行的,但它在配置文件上是一个值得注意的昙花一现,尽管它是该计划的一个相当小的部分.
更多信息:
虽然这都是在一个循环中完成的,但每次数据(略微)都不同,因此重用数据结构并不像这个问题那样容易.
使用Gronim建议的维基百科选择算法将这部分运行时间减少了大约20倍.
由于我找不到C#实现,这就是我想出的.即使对于小型输入,它也比Array.Sort更快; 在1000个元素上它快25倍.
public static double QuickSelect(double[] list, int k) {
return QuickSelect(list, k, 0, list.Length);
}
public static double QuickSelect(double[] list, int k, int startI, int endI) {
while (true) {
// Assume startI <= k < endI
int pivotI = (startI + endI) / 2; //arbitrary, but good if sorted
int splitI = partition(list, startI, …
Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×3
inheritance ×2
algorithm ×1
c++ ×1
f# ×1
f#-scripting ×1
filesystems ×1
interface ×1
linq ×1
path ×1
percentile ×1
powershell ×1
reactjs ×1
scripting ×1
static ×1
unit-testing ×1
wpf ×1