标签: framework-design

MethodImplOptions.InternalCall有什么意义?

BCL中的许多方法都标有 [MethodImpl(MethodImplOptions.InternalCall)]属性.这表明 "方法是在公共语言运行时本身内实现的".

以这种方式设计框架的重点是指定了运行时将被强制实现的显式CIL指令?最终,该属性正在为运行时创建合同义务,但在某种程度上,我觉得这种方式令人困惑,而且不是很明显.

例如,Math.Pow本来可以用这种方式编写(请原谅我非正式的C#+ IL和IL本身,如果它不好的话;这只是一个解释我的观点的样本):

public static double Pow(double x, double y)
{
    ldarg.0
    ldarg.1
    pow // Dedicated CIL instruction
    ret
}
Run Code Online (Sandbox Code Playgroud)

而不是当前的方式:

[MethodImpl(MethodImplOptions.InternalCall)]
public static double Pow(double x, double y);
Run Code Online (Sandbox Code Playgroud)

为什么MethodImplOptions.InternalCall存在?

.net clr cil framework-design

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

ReSharper在成员"EntityID"中抱怨大写"ID"

我在一个类中有一个属性"EntityID".Resharper(5.1)说

名称"EntityID"与规则"方法,属性和事件"不匹配.建议的名称是'EntityId'.

但恕我直言,根据类库开发人员设计指南中的命名惯例.'EntityID'应该非常好:

  • 不要使用计算领域通常不接受的首字母缩略词.
  • 在适当的地方,使用众所周知的首字母缩略词来替换冗长的短语名称.例如,使用UI作为用户界面,使用OLAP进行在线分析处理.
  • 使用首字母缩略词时,请使用Pascal case或camel case作为长度超过两个字符的首字母缩略词.例如,使用HtmlButton或htmlButton.但是,您应该将仅包含两个字符的首字母缩写词大写,例如System.IO而不是System.Io.
  • 不要在标识符或参数名称中使用缩写.如果必须使用缩写,请将camel case用于包含两个以上字符的缩写,即使这与单词的标准缩写相矛盾

*更新:*指南的最新版本还说:

除了骆驼标识符的第一个单词之外,请将两个字符的首字母缩写大写. 名为DBRate的属性是用作Pascal标识符的第一个单词的简短缩写(DB)的示例.名为ioChannel的参数是用作驼峰标识符的第一个单词的简短首字母缩写词(IO)的示例.

我是否正确理解指南?如果是这样,我怎么能让ReSharper接受"EntityID"(众所周知的两个字母的缩写),但拒绝"HTMLReader"(它应该是HtmlReader).

c# resharper naming-conventions framework-design

24
推荐指数
4
解决办法
9579
查看次数

设计GUI框架

我需要为项目创建一个自定义GUI框架.我实际上创建了一个非常原始的GUI框架,它有按钮,图像,文本等.但它非常简单,我没有任何设计GUI框架的先验知识.我们正在进行的项目有点严重,我需要做得更好.那么,您可以为我推荐哪些书籍或任何类型的文档?

注意:我想以面向对象的方式创建框架,我可能会使用C#,但文档不需要在C#中.

user-interface framework-design

11
推荐指数
1
解决办法
3293
查看次数

使用模块化设计组织良好的ASP.NET应用程序的最佳方法

我正在考虑为我们的产品开发考虑一个Web应用程序开发框架.我想构建一个ASP.NET应用程序,其中包含许多子模块.我的要求是:

  1. 该应用程序将是一套不同的模块,如CRM,Bugtracker,库存管理,财务管理等.

  2. 每个模块都应该有自己的DLL.

  3. 一个项目应该是应用程序的外部容器(如框架),并且该项目应该将解决方案中的所有其他模块(类型为Web应用程序)引入外部容器.(有些事我们在HTML中有框架).因此,我们将仅在一天结束时发布外部容器Web应用程序,并通过该方式访问所有其他Web应用程序项目.

我想为每个模块都有单独的DLL,所以当我部署控制整个套件的单个DLL时,我不必担心应用程序崩溃.

我不确定我的想法是否正确.我正在寻找的最终结果是一个维护良好,有组织和模块化的Web应用程序套件.

它是ASP.NET Web表单,而不是MVC.我将使用VS2010进行开发.

这样做的最佳方法是什么?

编辑:

术语外部容器意味着它就像一个母版页,它有各种模块的链接,各种模块并不总是在同一个项目中.它们可以是同一解决方案下的独立项目.而且我的印象是,到一天结束时,我将只发布该项目,它将带来各种模块.

asp.net modularity framework-design

7
推荐指数
1
解决办法
1510
查看次数

ToString应该用于关键信息吗?

我刚刚遇到一些覆盖ToString()并返回一些关键信息(不仅仅是调试信息)的代码.此类用户调用ToString()并解析该关键数据.

我的意见,从多年来阅读各种各样的点点滴滴,是ToString()有一个相当弱的contract,即覆盖它(如果你想)显示一些有意义的东西.

看到我说那里的显示器?我遇到的代码依赖于此类实例的文本表示非常具体; 添加除预期之外的任何东西都会导致各种各样的问题.

所以,我的问题是,如果一个对象的文本表示是关键的,应该ToString()使用还是应该使用更明确的方法/属性,例如AsText

.net c# framework-design

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

如何在可重用的.NET库上启用向前兼容性?

我正在创建一个我的玩具项目的新次要版本.该项目在NuGet上发布,与.NET 4.0及更高版本兼容.我正在介绍的一些新功能需要.NET 4.5(用户应该能够解析,IReadOnlyCollection<T>以及IReadOnlyList<T>.NET 4.5中引入的两个接口),但我需要保持项目与.NET 4.0兼容,因为不是所有的开发人员可以轻松迁移到最新的.NET框架.

所以我面临的问题是如何解决这个"前向兼容性"问题.我想到了两种解决方案,但两者都不是很有吸引力,所以希望任何人都可以在这里给我一些想法或指导.

以下是我提出的两个解决方案:

解决方案1:使用#if编译器指令并根据.NET框架版本构建DLL,并使用NuGet包发布这些版本并在项目站点下载.

这种方法的缺点是当开发人员将他们的Visual Studio项目从.NET 4.0更新到.NET 4.5时,他们不会自动获得.NET 4.5版本(具有.NET 4.5特定功能).这违反了最不惊讶原则,并且当开发人员在几个月后尝试使用它时,会让开发人员对这个功能无效的原因感到茫然.

解决方案2:使用单个DLL并动态发出类型,当它们存在于当前应用程序域中时实现这两个新接口.这允许将单个DLL发送给用户,并允许在开发人员在其项目中切换.NET框架版本时提供功能.这将使事情'正常工作'.这是我目前正朝着顺便前进的方向.

因为我需要返回一个需要实现接口的类型,所以缺点是必须在运行时使用Reflection.Emit,ModuleBuilder,TypeBuilder等创建该类型.这是非常讨厌的shizzle.但除此之外,由于这种类型必须在一个新的(匿名)程序集中创建,我必须将一些内部类型设为public(它需要继承的类型和它需要实现的接口).使这些内部类型公开污染项目的API,并禁止我对这些类型进行更改.

我相信这些是我的选择,但我可能会遗漏一些明显的东西.所以我的问题是,我错过了一个可能性吗?有没有办法绕过解决方案1的问题,或者更好地使用运行时类型的硬核根发射?

.net c# frameworks framework-design nuget

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

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

我应该如何在 node.js 上实现会话存储

我正在创建josi,一个用于 node.js 的网络框架。我想添加会话存储。实现这一点的最佳方法是什么?我假设它可能必须基于 cookie,但我很想知道是否有任何其他框架有不同的方法。

session framework-design session-cookies node.js

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

使所有方法在PHP中返回MyResult对象是好/常识编程实践吗?

通过MVC架构设计程序的几个层次,我发现我希望有更多关于更深层的方法返回结果的信息,并且我并不总是能够预测何时需要这些信息.并且 - 为了抽象起见 - 我可能不希望该方法将东西输出到特定于应用程序的日志(该方法可以在不同的程序中使用),或者像上面的其他层一样具有特定的依赖于应用程序的行为.

例如,在给定的实用程序函数中,我可能在执行操作之前有几个先决条件检查,但失败了.如果我对其中任何一个返回false,则调用者不知道发生了什么.如果我返回false并记录应用程序日志发生的事情,我将该函数绑定到特定于应用程序的行为.

问题是:实现一个名为MyResult的小类并使其返回响应状态(ok/false),消息,最终整数代码以及调用者可以调用的对象占位符(数组或对象)是好的/常见的实践访问返回的对象?这个MyResult类将在整个系统中使用,并且是所有方法与其调用者之间的常见"方言".然后,所有方法都会返回MyResult的实例.

php framework-design

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

为什么我可以锁定C#中的任何对象类型?

有人可以详细解释为什么lock在C#中对任何类型的对象都有可能吗?

我理解它是什么lock以及如何使用它.我知道它如何扩展到Monitor.Enter/ Exit.我正在寻找实施细节和设计考虑因素的解释.

首先:引擎盖下发生了什么?例如:对象实例中是否有额外的位(就像RTTI/vtable那样)可以使它工作?或者在对象引用上键入某种查找表?(如果是这样,它如何与GC交互?)或其他什么?为什么我不必创建一个特定类型的实例来保存锁定数据?

(顺便说一下,在本机代码中做什么EnterExit映射到什么?)

其次,为什么 .NET设计为没有特定类型来取出锁定?(鉴于你通常只new object()为了这个目的而制作一个- 而且你锁定"任何旧对象"的大多数情况都是有问题的.)这个设计选择是否被实现细节强迫了?还是故意的?而且,如果是故意的,这是一个不错的选择吗?(我意识到第二部分可能需要推测.)

.net c# multithreading language-design framework-design

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

通用集合继承

我正在使用MVVM构建一个WPF应用程序并使用ObservableCollection.在处理我的ViewModel时,我决定检查ObservableCollection的类型定义,我看到了一些我认为奇怪的东西:

// class definition for ObservableCollection
ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
// derives from Collection<T>
... 
// class definition for Collection<T>
Collection<T> : IList<T>, ICollection<T>, IEnumerable<T> ... (as well as non-generics)
Run Code Online (Sandbox Code Playgroud)

现在,问题是:

If ICollection<T> implements IEnumerable<T> 
AND 
IList<T> implements ICollection<T> AS WELL AS IEnumerable<T>
...
...
Why does Collection<T> implement ALL THREE?
Run Code Online (Sandbox Code Playgroud)

这真的是它的实现方式还是这个VS2010在我身上耍花招?

.net c# generics framework-design

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

良好的班级名称的想法

如何使用以下公共接口命名类:

/// <summary>
///     Enqeues and exectutes actions synchronously on seperated threads using the <see cref="ThreadPool"/>. 
/// </summary>
/// <remarks>
///     Syncronism is guaranteed on a per-instance base in that each enqued action will be executed
///     after the previous action has completed execution for each instance of <see cref="ThreadPoolExectutor" /> 
/// </remarks>
internal class ThreadPoolExectutor
{
    /// <summary>
    /// Initializes a new instance of the <see cref="ThreadPoolExectutor"/> class.
    /// </summary>
    /// <param name="capacity">The absolute (not the initial) number of …
Run Code Online (Sandbox Code Playgroud)

.net c# naming-conventions framework-design

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