小编Ern*_*ieL的帖子

用于创建简单且高效的值类型的模式

动机:

在阅读Mark Seemann关于Code Smell:Automatic Property的博客时,他说接近结尾:

底线是自动属性很少适用.实际上,只有当属性的类型是值类型并且允许所有可想到的值时,它们才适用.

他给出int Temperature了一个难闻的气味的例子,并建议最好的修复是单位特定值类型,如摄氏.所以我决定尝试编写一个自定义的Celsius值类型,它封装了所有边界检查和类型转换逻辑,作为更加SOLID的练习.

基本要求:

  1. 不可能有无效的价值
  2. 封装转换操作
  3. 有效的应对(相当于替换它的int)
  4. 尽可能直观地使用(尝试int的语义)

执行:

[System.Diagnostics.DebuggerDisplay("{m_value}")]
public struct Celsius // : IComparable, IFormattable, etc...
{
    private int m_value;

    public static readonly Celsius MinValue = new Celsius() { m_value = -273 };           // absolute zero
    public static readonly Celsius MaxValue = new Celsius() { m_value = int.MaxValue };

    private Celsius(int temp)
    {
        if (temp < Celsius.MinValue)
            throw new ArgumentOutOfRangeException("temp", "Value cannot be less then Celsius.MinValue (absolute …
Run Code Online (Sandbox Code Playgroud)

c# encapsulation design-patterns value-type solid-principles

24
推荐指数
2
解决办法
8676
查看次数

C#类向后兼容性规则/避免中断更改

我正在研究C#3.5程序集,它被企业服务器环境中的许多不同应用程序使用.我想在现有的C#类(不是抽象)中添加一些属性,并保持与当前客户端的向后兼容性,而无需重新编译.这是一个强烈命名的3.5组装.现有的客户端应用程序不会被重新编译.相反,我们使用发布者策略程序集将现有客户端重定向到更新版本.

维护这种类向后兼容性的规则是什么?

我正在寻找一些规则,我可以验证我的代码更改.

在我当前尝试更新类客户端之后抛出"找到的程序集的清单定义与程序集引用不匹配"异常.

.net c# backwards-compatibility

23
推荐指数
1
解决办法
6336
查看次数

如何使用log4net知道当前日志级别以存储在数据库中

如何使用log4net在应用程序的数据库中存储当前日志级别.

.net c# log4net

4
推荐指数
1
解决办法
3261
查看次数

在Log4Net消息到达附加程序之前对其进行编辑

我有一个安全工具,可以通过电子邮件向用户发送新密码。当阈值为VERBOSE时,生产电子邮件模块(我不拥有并且不想更改)将使用Log4Net记录整个html电子邮件正文。由于电子邮件包含明文形式的域用户密码,因此,我想在日志消息到达附加程序之前从日志消息中删除该密码。

有没有一种方法可以将对象临时插入Log4Net堆栈中,从而允许我搜索LoggingEvent消息并对其进行更改以掩盖我找到的所有密码?我想插入对象,调用电子邮件模块,然后删除对象。

c# logging log4net appender log4net-configuration

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

从StackFrame获取Type T.

目标是基于调用my方法的类型创建一个通用实例.

问题是,当从泛型调用时,StackFrame似乎只包含开放定义类型参数而不是封闭定义类型参数.如何从StackFrame中获取类型参数?与此问题类似.我想我的情况有所不同,因为Log.Debug是从一个封闭的方法调用的.

如果StackFrame不是正确的方法,除IoC以外的任何建议?此代码用于填写对我的Unity容器的引用不可用的情况.

using System;
using System.Reflection;

namespace ReflectionTest
{
    public class Logger
    {
        private readonly string loggerName;
        protected Logger(string loggerName) { this.loggerName = loggerName; }
        public void Debug(string message) { Console.WriteLine(string.Format("{0} - {1}", loggerName, message)); }
    }

    public class Logger<T> : Logger
    {
        public Logger() : base(typeof(T).FullName) { }
    }

    public static class Log
    {
        public static void Debug(string message)
        {
            // Determine the calling function, and create a Logger<T> for it.
            System.Diagnostics.StackFrame frame = new System.Diagnostics.StackFrame(1); …
Run Code Online (Sandbox Code Playgroud)

.net c# generics reflection

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

Case不区分大小写的字符串哈希(SHA)

我将名称字符串及其SHA1值传递到数据库中.SHA值用作搜索的索引.实现完成后,我们要求使搜索名称不区分大小写.我们确实需要考虑所有语言(汉字是一个真实的用例).

我知道土耳其测试.如何在散列之前将输入字符串转换为不区分大小写?理想情况下,我希望它等同于InvariantCultureIgnoreCase.

换句话说,如何使此函数的输出不区分大小写?

private byte[] ComputeHash(string s)
{
     byte[] data = System.Text.Encoding.Unicode.GetBytes(s ?? string.Empty);
     SHA1 sha = new SHA1CryptoServiceProvider();     // returns 160 bit value
     return sha.ComputeHash(data);
}
Run Code Online (Sandbox Code Playgroud)

如果SHA不可能,我可能能够使String.GetHashCode()工作,但我也没有办法让这种情况不敏感.

我打赌这是不可能的.如果不是,有什么工作吗?

c# hash search

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