小编The*_*rff的帖子

使用[Serializable]属性或MarshalByRefObject的子类化?

我想在AppDomains中使用一个对象.

为此,我可以使用[Serializeable]属性:

[Serializable]
class MyClass
{
    public string GetSomeString() { return "someString" }
}
Run Code Online (Sandbox Code Playgroud)

或MarshalByRefObject的子类:

class MyClass: MarshalByRefObject
{
    public string GetSomeString() { return "someString" }
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都可以使用这样的类:

AppDomain appDomain = AppDomain.CreateDomain("AppDomain");
MyClass myObject = (MyClass)appDomain.CreateInstanceAndUnwrap(
                   typeof(MyClass).Assembly.FullName,
                   typeof(MyClass).FullName);
Console.WriteLine(myObject.GetSomeString());
Run Code Online (Sandbox Code Playgroud)

为什么两种方法似乎都有相同的效果?两种方法有什么不同?我什么时候应该支持另一种方法呢?

编辑:从表面上看,我知道两种机制之间存在差异,但如果有人跳出丛林并问我这个问题,我无法给他一个正确的答案.问题是非常开放的问题.我希望有人可以比我能做的更好地解释它.

c# remoting appdomain

17
推荐指数
3
解决办法
6776
查看次数

单元测试是否不需要Debug.Assert()?

我已经准备好Mcconnell的" 代码完成 " 了一段时间.现在我在亨特和托马斯的" 实用程序员 "中再次阅读:使用断言!注意:我的意思是,不是单元测试断言Debug.Assert().

在SO问题之后什么时候应该使用Debug.Assert()?当使用断言过例外领域类的断言是发展有用的,因为"不可能"的情况下,可以发现相当快.它们似乎很常用.据我理解的断言,在C#中,它们通常用于检查"不可能"值的输入变量.

为了尽可能简化和隔离单元测试,我用nulls和"不可能"的虚拟输入(如空字符串)来提供类和方法.

此类测试明确记录,它们不依赖于某些特定输入.注意:我正在练习Meszaros的"xUnit测试模式"描述为Minimal Fixture.

这就是重点:如果我有一个保护这些输入的断言,它们会炸毁我的单元测试.

我喜欢断言编​​程的想法,但另一方面我不需要强迫它.目前我想不出任何用途Debug.Assert().也许有一些我想念的东西?你有什么建议,他们真的有用吗?也许我只是高估了断言的用处?或者也许我的测试方式需要重新审视?

编辑:调试的最佳实践单元测试期间的断言非常相似,但它没有回答困扰我的问题:如果我Debug.Assert()按照我的描述进行测试,我是否应该关心C#?如果是的话,它们在哪种情况下真的有用?在我目前的观点中,这样的单元测试将Debug.Assert()没有必要.

另一点:如果你真的认为,这是一个重复的问题,只需发表一些评论.

c# unit-testing

10
推荐指数
1
解决办法
1336
查看次数

Oracle:排除一列的更新以触发触发器

在oracle中我可以指定列,这应该会触发触发器:

create or replace trigger my_trigger
before update of col1, col2, col3 on my_table for each row
begin
  // the trigger code will be executed only if col1 or col2 or col3 was updated
end;
Run Code Online (Sandbox Code Playgroud)

现在我想要执行以下操作:当更新列时,我不希望触发器触发.这怎么可能?

我可以列出除一个列之外的所有列,这些列不应该触发触发器.对于包含许多列的表来说,这非常麻烦.

另一种方法是使用UPDATING函数,如下所示:

if not updating('COL3') then ...
Run Code Online (Sandbox Code Playgroud)

但是,如果我立刻更改了COL1 COL3,则该语句的计算结果为false.这不是我想要的,因为我只想更新列(COL3)时限制执行.

sql oracle triggers plsql

10
推荐指数
2
解决办法
2万
查看次数

是否可以在XAML中设置有选择地影响控件的样式?

<Window.Resources>我定义了以下样式:

    <Style x:Key="textBlockStyle" TargetType="TextBlock">
        <Setter Property="Margin" Value="5,0,5,0"/>
    </Style>
Run Code Online (Sandbox Code Playgroud)

我已经定义了一些网格,我有四个TextBlocks:

    <WrapPanel>
        <TextBlock Style="{StaticResource textBlockStyle}">Server</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">IP</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">Port</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">Status</TextBlock>
    </WrapPanel>
Run Code Online (Sandbox Code Playgroud)

问题:我需要参考textBlockStyle四次.

问题:是否可以在内部WrapPanel或其他地方设置该样式一次而不重复对样式的引用?

也许是这样的:

    <WrapPanel Style="{StaticResource textBlockStyle}">
        <TextBlock>Server</TextBlock>
        <TextBlock>IP</TextBlock>
        <TextBlock>Port</TextBlock>
        <TextBlock>Status</TextBlock>
    </WrapPanel>
Run Code Online (Sandbox Code Playgroud)

我不是在寻找全球解决方案!我可以删除该x:Key="textBlockStyle"属性,但这会影响窗口中的所有 属性TextBlocks.我需要一个更具选择性的机制,但没有那个丑陋的代码重复.

.net wpf xaml styles

9
推荐指数
1
解决办法
3175
查看次数

你是小步重构吗?

在读了福勒的"重构"一段时间之后,我仍然经常发现自己"我应该用更小的步骤做到这一点." - 即使我没有破坏我的代码.

小步骤重构是安全的,但成本时间.这是速度和风险之间的权衡 - 我试图在选择我的重构方式时具有战略性.

尽管如此:大多数时候我正在以更大的步骤进行重构.如果我参考福勒的"力学"部分并比较我的工作方式,我可能会发现我经常一步向前迈出两到五步.这并不意味着我是一名重构大师.我的代码可能会停留5到60分钟或者无法编译.

您是否以较小的步骤重构并尝试以较短的频率生成完整的代码?而且:你成功做到了这一点吗?

refactoring coding-style

6
推荐指数
1
解决办法
524
查看次数

数据库中的一些数据更改.如何触发一些C#代码在这些更改上做一些工作?

假设我有一些带有数据库的应用程序A. 现在我想添加另一个应用程序B,它应该跟踪应用程序A的数据库更改.应用程序B应该在数据发生变化时进行一些计算.两个应用程序之间没有直接通信.两者都只能看到数据库.

基本问题是:数据库中的某些数据发生了变化.如何触发一些C#代码在这些更改上做一些工作?


为了给出答案的一些刺激,我提到了一些我正在考虑的方法:

  1. 使应用程序B轮询感兴趣的表中的更改.优点:简单的方法.缺点:流量很大,特别是涉及到许多表时.
  2. 引入触发器,触发某些事件.当他们开火时,他们应该在"事件表"中写入一些条目.应用程序B只需要轮询"事件表".优势:减少流量.缺点:逻辑以触发器的形式放入数据库.(这不是触发器"邪恶"的问题.这是一个设计问题,这使它成为一个劣势.)
  3. 摆脱轮询方法并使用SqlDependency类来获取更改通知.优势:(可能?)流量少于轮询方式.缺点:不是数据库独立的.(我知道ODP.NET中的OracleDependency,但其他数据库呢?)

什么方法更有利?也许我已经错过了上述方法中的一些主要(dis)优势?也许还有其他一些我没有想到的方法?


编辑1:数据库独立性是...让我们称之为"销售人员"的一个因素.我可以使用SqlDependency或OracleDependency.对于DB2或其他数据库,我可以回退到轮询方法.这只是成本和收益的问题,我想至少考虑一下,以便我可以讨论它.

c# database ado.net odp.net

6
推荐指数
1
解决办法
5918
查看次数

如何使源代码成为XML文档的一部分而不是违反DRY?

我想将部分源代码添加到XML文档中.我可以将源代码复制并粘贴到一些<code>元素中,如下所示:

/// <summary>
/// Says hello world in a very basic way:
/// <code>
///   System.Console.WriteLine("Hello World!");
///   System.Console.WriteLine("Press any key to exit.");
///   System.Console.ReadKey();
/// </code>
/// </summary>
static void Main() 
{
    System.Console.WriteLine("Hello World!");
    System.Console.WriteLine("Press any key to exit.");
    System.Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

保持这一点将是痛苦的.是否有其他可能性将源代码添加到C#中的XML文档中?

我正在使用Sandcastle处理XML文档,并希望从中提供技术帮助文件(*.chm).我想在该帮助文件中添加部件或完整的方法体.


编辑: 感谢slide_rule的评论.我添加了一个更现实,更简单的例子:

假设我有这样的方法:

public decimal CalculateFee(Bill bill)
{
    if (bill.TotalSum < 5000) return 500;
    else
    {
        if (bill.ContainsSpecialOffer) return bill.TotalSum * 0.01;
        else return bill.TotalSum * 0.02;
    }
}
Run Code Online (Sandbox Code Playgroud)

很高兴有可能将费用的计算方法添加到技术帮助文件中.

最明显的解决方案是将算法作为平淡无奇的文本写入评论中,如:"如果账单的总金额小于5000那么......".

另一种解决方案是将方法的主体复制并粘贴到注释字段中,并将其放入<code>元素中.即使没有太多关于C#的知识,也可以很容易地理解这个方法体 - 所以将它放入技术帮助文件中没有任何错误.

这两种解决方案都违反了DRY原则!我想将方法​​体或方法体的各个部分添加到帮助文件中,而不重复信息. …

.net c# dry documentation-generation

6
推荐指数
1
解决办法
440
查看次数

您是否将NHibernate用于具有遗留数据库的项目,这部分是您无法控制的?

对我来说,目前的答案是:不,我会使用iBatis,因为当数据库模型和对象模型不同步时,NHibernate很痛苦.如果我没有完全控制数据库,我最终会做很多工作.

我为什么这么问?

好吧,首先:我从未使用过NHibernate.我只是从表面上知道它.我已经了解了iBatis对旧数据库的优势.

第二:最近我与一个使用Hibernate的人进行了讨论(jep,在Hibernate之前没有'N').他告诉我,ORM框架现在非常先进并且提倡Hibernate.由于我对NHibernate不感兴趣,所以我没有跟踪最近的发展.

也许我是时候重新考虑我的答案了吗?

legacy nhibernate orm ibatis

5
推荐指数
1
解决办法
1497
查看次数

在.NET中进行事后分析有什么可能性(例如在程序崩溃之后)?

我们假设有一个C#程序,它用作Windows服务.让我们假设服务已经疯狂,并且像疯了一样消耗CPU和内存.它需要很快重新启动,因为它是一个生产系统.所以我没有太多时间收集运行时信息.也许快速浏览任务管理器......就是这样.

之后,我所拥有的只是log4net日志文件和用于事后分析的Windows事件日志.

假设我找到了问题的原因.其他人修复了它,也许程序员添加了一些额外的日志记录,所以我下次可以更快地找到类似的问题.尽管如此:我仍然依赖于日志文件的质量,并希望下次问题会以某种方式在记录中显示出来.

是否还有其他方法进行验尸分析?也许像线程转储(如java),内存转储或其他东西,这可能有助于事后分析?也许一些内置的.NET框架工具可以提供帮助吗?

我对真实的项目经验以及如何解决这个维护问题非常感兴趣,我认为这对大多数程序员来说都是非常真实的.

.net c# maintenance

5
推荐指数
0
解决办法
436
查看次数

使用附加的C#应用​​程序迁移Oracle数据库:如何管理数据库迁移?

我有一个C#应用程序,它可以与Oracle数据库一起使用,并且已经发布.现在是时候发布新版本了.C#对象模型已经过修改,并对表结构产生了影响.

如果我发布新版本,我需要处理现有数据.只是删除表并重新创建这些表不会让任何客户满意.

为了解决这个问题,我收集了SQL脚本,它将先前发布的数据库结构改为新的数据库结构.在此过程中,数据也会迁移.SQL脚本被提交到C#源代码等存储库.在CruiseControl.NET的帮助下,定期测试数据库的修补程序.针对修补的数据库运行NUnit测试,以发现数据库表和C#对象模型之间的不匹配.

整个过程确实有效,但我觉得这可以做得更好.我认为数据库迁移非常关键.运送的应用程序无法使用错误修补的数据库,没有任何价值.丢失数据是不可接受的.这些恐怖场景可能会让我觉得根本不要改变数据库.因此,对我使用的工具和实践充满信心对我来说非常重要.

上周我偶然发现了LiquiBase,我问自己 - 现在在SO:

哪些工具或实践有助于以较低的风险和更大的信心进行数据库迁移?那里有好书或网络资源吗?

我对C#和Oracle的特定解决方案特别感兴趣,它可能适合我上面概述的开发过程.

c# database migration oracle

3
推荐指数
1
解决办法
1886
查看次数

将ObjectDataProvider绑定到属​​性而不是方法

假设您有以下课程:

class ProcessController
{
    public List<Process> Active { get { ... } }
    ...
    public List<Process> GetProcesses() { ... }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用GetMethod绑定ObjectDataProviderGetProcesses()方法:

<ObjectDataProvider x:Key="pList"
                    MethodName="GetProcesses"
                    ObjectType="{x:Type local:ProcessController}"/>
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以绑定到该属性Active吗?

如果发现我可以做以下事情:

<ObjectDataProvider x:Key="pList"
                    MethodName="get_Active"
                    ObjectType="{x:Type local:ProcessController}"/>
Run Code Online (Sandbox Code Playgroud)

但不知怎的,这感觉不对.

是否有一些更清晰的方式或"正确"的方式来访问属性而不是调用方法?

wpf binding objectdataprovider

3
推荐指数
2
解决办法
6953
查看次数

SubSonic vs. Castle ActiveRecord

对于即将推出的项目,需要在旧版Oracle数据库周围编写C#代码.它将以数据为中心,因为大多数代码都会处理数据操作 - 几乎没有业务规则.所以我决定反对一个完整的ORM并选择Active Record方法.

我遇到两个选项:SubSonicCastle ActiveRecord

谁有这两种实现的经验?当我在它们之间做出选择时,我应该考虑哪些因素?哪一个更稳定/更快/更容易使用/有一个良好的支持社区?

我很乐意得到一些决定指导.

subsonic nhibernate orm castle-activerecord subsonic-active-record

3
推荐指数
1
解决办法
940
查看次数