我对C#比较陌生,每次我开始研究C#项目(我只用C#中几乎成熟的项目)我想知道为什么没有内部类?
也许我不明白他们的目标.对我来说,内部类 - 至少是私有内部类 - 看起来很像Pascal/Modula-2/Ada中的"内部程序":它们允许在较小的部分中分解主类以便于理解.
示例:这是大多数时间看到的内容:
public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // ClassB is only used by ClassA
<some code>
}
}
public class ClassB
{
public DoSomething()
{
}
}
Run Code Online (Sandbox Code Playgroud)
由于ClassB只会被ClassA使用(至少有一段时间),我猜这个代码会更好地表达如下:
public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // Class B is only usable by ClassA
<some code>
}
private class ClassB
{
public DoSomething()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我很高兴收到你关于这个主题的消息 - 我是对的吗?
令人惊讶的是,String.Clone()不会像返回的那样返回字符串的副本String.Copy().相反,它返回'this'原始字符串.
我想了解为什么.Net Framework团队选择这样做.
根据MSDN:
ICloneable接口[...]要求您的Clone方法实现返回当前对象实例的副本.
String.Clone() 显然不遵循本指南.
我知道字符串是不可变的,但如果不变性是这里的原因,String.Copy()也会返回,this但事实并非如此.
当然,这是一个相当理论化的问题.
我只是遇到了一些非常奇怪的东西:当你在一个值类型上使用Equals()方法时(如果这个方法当然没有被覆盖)你会得到一些非常慢的东西- 使用一对一比较字段反思!如:
public struct MyStruct{
int i;
}
(...)
MyStruct s, t;
s.i = 0;
t.i = 1;
if ( s.Equals( t )) /* s.i will be compared to t.i via reflection here. */
(...)
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么C#编译器不生成比较值类型的简单方法?像(在MyStruct的定义中):
public override bool Equals( Object o ){
if ( this.i == o.i )
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
编译器在编译时知道MyStruct的字段是什么,为什么它要等到运行时才能枚举MyStruct字段?
对我来说很奇怪.
谢谢 :)
补充:对不起,我只是意识到,当然,Equals它不是语言关键字而是运行时方法......编译器完全不知道这种方法.所以在这里使用反射是有意义的.
常量是美丽的人 - 他们可以在一个独特的地方保存一个在代码中随处可用的值.更改该值只需要一个简单的修改.
生活是很酷.
嗯,这是承诺.现实有时是不同的:
LogCompleteFileName常量值更改L:\LOGS\MyApp.log为\\Traces\App208.txt,您将获得两个文件:\\traces\App208.txt对于跟踪和\\traces\App208.txt.log日志...TransactionTimeout将从2分钟更改为4分钟,并且在2分钟后仍然会超时(在花了一天之后,您会发现您还必须更改DBMS的超时和事务管理器的超时...).SleepTimeInMinutes从1到10,你看到没有变化(一个小时左右后,你会发现,不断的名字是误导:粒度不分钟,但毫秒...).CompanyName,比如说Yahoo,Microsoft但自动邮件警报仍然发送给alert@yahoo.com...创建常量是契约.你告诉你的读者,每当他们改变价值时,它仍然会按照他们认为应该的方式运作.
没什么.
当然,你需要测试一下你是不是误导了你的读者.您必须确保隐含合同是正确的.
你如何用TDD实现这一目标?我只是坚持这一点.我可以测试常量(!)值的变化的唯一方法是使该常量变为应用程序设置...... const当我认为该值可以并且将会改变时,我是否必须得出结论:应该避免使用关键字?
你是如何使用TDD测试你的(所谓的)常量的?
提前谢谢了 :)
当我调试时,我经常不得不处理不使用中间变量来存储返回值的方法:
private int myMethod_1()
{
return 12;
}
private int myMethod_2()
{
return someCall( someValue );
}
Run Code Online (Sandbox Code Playgroud)
好吧,为了重新创建一个bug,我经常需要动态更改值.在这里,我想看看myMethode_1返回零时会发生什么.同样的事情myMethod_2.
有没有办法在不修改代码的情况下做到这一点?我想做的是,在返回行(或结束括号)上放置一个断点并输入一个新的返回值.
注意:我正在使用Visual Studio 2005和Visual Studio 2008.
谢谢 !
我的问题很模糊:o) - 但这是一个例子:
当我编写C代码时,我能够在出现故障时记录计数器的值:
<...>
for ( int i = 0 ; i < n ; i++ )
if ( SUCCESS != myCall())
Log( "Failure, i = %d", i );
<...>
Run Code Online (Sandbox Code Playgroud)
现在,使用异常,我得到这个:
try
{
<...>
for ( int i = 0 ; i < n ; i++ )
myCall();
<...>
}
catch ( Exception exception )
{
Log( "Failure ! Maybe in myCall() ? Don't know. i's value ? No clue." );
}
Run Code Online (Sandbox Code Playgroud)
当然,可以在try/catch语句之外声明"i"(这就是我正在做的事情).但我不喜欢它 - 我喜欢声明变量在哪里使用,而不是之前.
但也许我在这里遗漏了一些东西.你有什么优雅的解决方案吗?
预先感谢 !西尔万.
ADDED:myCall()是一个不起眼的API调用 …
这是一个关于VB.NET语言的问题.由于我每天都在使用它,所以我只是试着理解它的一些结构背后的动机.
我只是发现这一行:
If myObject Is Nothing then
Run Code Online (Sandbox Code Playgroud)
这个是正确的:
If Nothing Is myObject Then
Run Code Online (Sandbox Code Playgroud)
结果相同.使用ildasm,我们可以看到这些行被转换为:
if myObject = null then
Run Code Online (Sandbox Code Playgroud)
和
if null = myObject then
Run Code Online (Sandbox Code Playgroud)
好吧,但是,在VB.NET中,你不能写:
if myObject = Nothing Then
Run Code Online (Sandbox Code Playgroud)
编译器不会接受.
嗯,对我来说,如果没有,myObject比IfObject = Nothing更不明显.
为什么VB.NET作者只是反思?任何提示?
在工作中,我们将 Sourcetree 与 GitHub 结合使用作为我们代码的源代码控制解决方案。在我们的存储库中,我们还创建了几个标签并将它们推送到远程存储库。然而,一些曾经创建并随后删除的标签通常会再次出现在每个开发人员的本地存储库(以及远程存储库)中。
我们已经删除了每个开发人员本地存储库中的不正确标签,并确保禁用了“推送所有标签”复选框:
然而,这些标签不断重新出现,我们无法看出是哪个开发人员对此负责。
我的问题是,是否有一个 git 命令可以查看谁将标签从本地存储库推送到远程?或者是否有另一种永久的方法来防止已删除的标签再次出现?
在工作中,我们有生产数据库,开发人员具有读取权限.当开发人员必须在数据库中修复某些内容时,他们必须在生产数据库的副本中测试他们的脚本,然后要求DBA团队在生产中执行它.
但有时,必须修复的数据不在测试数据库中.然后开发人员要求提供生产数据库的新副本,这可能需要很长时间.
当然,我们可以授予他们更新权限并要求他们使用BEGIN TRANSACTION/ROLLBACK,但风险太大.没有人想要那个,甚至不是开发者.
我的问题:是否有可能SQL Server上创建一个配置文件-或授予特殊权限-这将允许执行更新和删除命令,但会始终,无论是开发者写的东西,经过GO或发出的最后命令后回退会话?
这对于在将脚本发送到生产之前测试脚本非常有用.
这对我来说很困惑.我们为什么要使用x:Key=和x:Name=到位的key=和name=?
这x是从哪里来的?
谢谢!