Tag: C#的

位掩码(标志)枚举变得太大时该怎么办

在我的应用程序中,我有一个非常大的权限集合,用Flags枚举表示。 它正在快速接近长数据types的实际上限。 我不得不提出一个策略,以尽快过渡到不同的结构。 现在,我可以将这个列表分解成更小的部分,但是,根据我们的应用程序布局,这已经只是我们应用程序整体权限的一个子集。 在pipe理权限时,我们广泛使用这种区别作为显示目的,如果我能够避免,我宁愿不必在此时重新访问该代码。 有其他人遇到这个问题? 你是怎么过去的? 一般的例子都很好,但我最感兴趣的是ac#的具体例子,如果有任何语言特定的技巧,我可以用来完成工作。 可能不是必需的,但这里是目前为我正在处理的应用程序部分定义的权限列表。 //Subgroup WebAgent [Flags] public enum WebAgentPermission : long { [DescriptionAttribute("View Rule Group")] ViewRuleGroup = 1, [DescriptionAttribute("Add Rule Group")] AddRuleGroup = 2, [DescriptionAttribute("Edit Rule Group")] EditRuleGroup = 4, [DescriptionAttribute("Delete Rule Group")] DeleteRuleGroup = 8, [DescriptionAttribute("View Rule")] ViewRule = 16, [DescriptionAttribute("Add Rule")] AddRule = 32, [DescriptionAttribute("Edit Rule")] EditRule […]

我如何使用unique_ptr pimpl?

这里是我尝试使用unique_ptr for pimpl时看到的简化。 我select了unique_ptr,因为我真的希望类拥有指针 – 我希望pimpl指针和类的生命期是相同的。 无论如何,这是标题: #ifndef HELP #define HELP 1 #include <memory> class Help { public: Help(int ii); ~Help() = default; private: class Impl; std::unique_ptr<Impl> _M_impl; }; #endif // HELP 这里是来源: #include "Help.h" class Help::Impl { public: Impl(int ii) : _M_i{ii} { } private: int _M_i; }; Help::Help(int ii) : _M_impl{new Help::Impl{ii}} { […]

正确的方式推迟任务的开始

我想安排一个任务,以x毫秒开始,并能够在开始之前取消它(或只是在任务开始时)。 第一次尝试会是这样的 var _cancelationTokenSource = new CancellationTokenSource(); var token = _cancelationTokenSource.Token; Task.Factory.StartNew(() => { token.ThrowIfCancellationRequested(); Thread.Sleep(100); token.ThrowIfCancellationRequested(); }).ContinueWith(t => { token.ThrowIfCancellationRequested(); DoWork(); token.ThrowIfCancellationRequested(); }, token); 但我觉得应该有一个更好的办法,因为这会在睡眠中用掉一根线,在此期间它可能被取消。 我的其他select是什么?

不可变的stringvs std :: string

我最近一直在阅读关于不可变string的知识, 在这里和这里以及为什么Dselect了不可变string的一些东西。 似乎有很多优点。 平凡线程安全 更安全 在大多数使用情况下更有效率。 便宜的子串(标记和切片) 更何况大多数新语言都有不可变的string,D2.0,Java,C#,Python等等。 C ++会从不可变的string中受益吗? 是否有可能实现一个不变的string类在c + +(或c + + 0x),将具有所有这些优势? 更新: 有两个尝试在不可变的stringconst_string和fix_str 。 在过去的五年中都没有更新。 他们甚至用过吗? 为什么没有const_string使它成为提升?

Visual Studio:debugging一个被引用的DLL,我在另一个SLN有源代码

我正在尝试debugging一个引用了我添加的DLL的项目,该DLL存储在一个外部目录中,而我只是添加了一个引用。 现在我当然可以debugging我的项目,但调用另一个DLL的方法,我不能步入它的行,即F12。 我能做到这一点的一个方法是将我的项目(DLL)作为一个现有的项目添加到我的解决scheme,并replace引用的DLL使用附加的项目,而不是磁盘上的文件。 但是多么混乱,我肯定有一个更清洁的方式? 我似乎记得,如果我复制一些PDB文件或什么,但我不记得了。 我是否需要打开2副本的视觉工作室,1为我的主要项目和1为我引用的DLL?

DDD中全局规则validation的位置

我是DDD的新手,我试图将其应用于现实生活中。 没有关于这种validation逻辑的问题,如空检查,空string检查等 – 直接进入实体构造函数/属性。 但是,在哪里可以validation一些全球规则,如“唯一用户名”? 所以,我们有实体用户 public class User : IAggregateRoot { private string _name; public string Name { get { return _name; } set { _name = value; } } // other data and behavior } 和用户的存储库 public interface IUserRepository : IRepository<User> { User FindByName(string name); } 选项是: 将资源库注入实体 将库注入工厂 创build域服务的操作 ??? 而每个选项更详细: 1。将资源库注册到实体 […]

C#中的幂等修饰符

我注意到,如果我写这样的东西: static void Main(string[] args) { const const const bool flag = true; } 编译器不会警告我多个const 。 所以这似乎模仿C修饰符,因为它们是幂等的。 但是,如果我写: private readonly readonly int a; 编译器警告我重复readonly 。 那么这里发生了什么? 修饰符是幂等的还是不? csc版本1.0.0.50618

易失性结构语义

将结构typesvariables的实例声明为volatile(如果它的字段在可重入代码中访问),还是必须声明结构的特定字段为volatile? 换句话说,在以下两者之间的语义差异(如果有的话)是什么? typdef struct { uint8_t bar; } foo_t; volatile foo_t foo_inst; 和 typedef struct{ volatile uint8_t bar; } foo_t; foo_t foo_inst; 我认识到将一个指针型variables声明为volatile(例如volatile uint8_t * foo)只是告诉编译器foo指向的地址可能会改变,而不会声明foo指向的值。 我不清楚类比是否适用于结构型variables。

单程飞行旅行的问题

您将进行单程间接飞行,其中包括数十亿 未知的非常大量的转移。 你不是在同一个机场停留两次。 你的旅行的每一部分都有1张票。 每张票包含src和dst机场。 所有的门票都是随机排列的。 你忘了原始的离港机场(第一个src)和你的目的地(最后一个dst)。 devise一个algorithm,以最小的复杂度重构您的旅程。 试图解决这个问题,我已经开始使用两套对称的差异 ,Srcs和Dsts: 1)对数组Srcs中的所有src键进行sorting 2)对数组Dst中的所有dst键进行sorting 3)创build一个两个数组的联合集,以find不重复的 – 他们是你的第一个src和最后一个dst 4)现在,有了起点,使用二进制search遍历两个数组。 但是我想应该有另一种更有效的方法。

将一个简单的C#DLL转换成COM互操作组件

如何将C#DLL转换为VB6应用程序可以使用的COM互操作DLL?