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存在?
我在一个类中有一个属性"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).
我需要为项目创建一个自定义GUI框架.我实际上创建了一个非常原始的GUI框架,它有按钮,图像,文本等.但它非常简单,我没有任何设计GUI框架的先验知识.我们正在进行的项目有点严重,我需要做得更好.那么,您可以为我推荐哪些书籍或任何类型的文档?
注意:我想以面向对象的方式创建框架,我可能会使用C#,但文档不需要在C#中.
我正在考虑为我们的产品开发考虑一个Web应用程序开发框架.我想构建一个ASP.NET应用程序,其中包含许多子模块.我的要求是:
该应用程序将是一套不同的模块,如CRM,Bugtracker,库存管理,财务管理等.
每个模块都应该有自己的DLL.
一个项目应该是应用程序的外部容器(如框架),并且该项目应该将解决方案中的所有其他模块(类型为Web应用程序)引入外部容器.(有些事我们在HTML中有框架).因此,我们将仅在一天结束时发布外部容器Web应用程序,并通过该方式访问所有其他Web应用程序项目.
我想为每个模块都有单独的DLL,所以当我部署控制整个套件的单个DLL时,我不必担心应用程序崩溃.
我不确定我的想法是否正确.我正在寻找的最终结果是一个维护良好,有组织和模块化的Web应用程序套件.
它是ASP.NET Web表单,而不是MVC.我将使用VS2010进行开发.
这样做的最佳方法是什么?
编辑:
术语外部容器意味着它就像一个母版页,它有各种模块的链接,各种模块并不总是在同一个项目中.它们可以是同一解决方案下的独立项目.而且我的印象是,到一天结束时,我将只发布该项目,它将带来各种模块.
我刚刚遇到一些覆盖ToString()并返回一些关键信息(不仅仅是调试信息)的代码.此类用户调用ToString()并解析该关键数据.
我的意见,从多年来阅读各种各样的点点滴滴,是ToString()有一个相当弱的contract,即覆盖它(如果你想)显示一些有意义的东西.
看到我说那里的显示器?我遇到的代码依赖于此类实例的文本表示非常具体; 添加除预期之外的任何东西都会导致各种各样的问题.
所以,我的问题是,如果一个对象的文本表示是关键的,应该ToString()使用还是应该使用更明确的方法/属性,例如AsText?
我正在创建一个我的玩具项目的新次要版本.该项目在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的问题,或者更好地使用运行时类型的硬核根发射?
总是有兴趣为什么Array.Sort()和Array.IndexOf()方法是静态的,类似的ArrayList.Sort()和ArrayList.IndexOf()被设计为成员方法.谢谢你的任何想法.
我正在创建josi,一个用于 node.js 的网络框架。我想添加会话存储。实现这一点的最佳方法是什么?我假设它可能必须基于 cookie,但我很想知道是否有任何其他框架有不同的方法。
通过MVC架构设计程序的几个层次,我发现我希望有更多关于更深层的方法返回结果的信息,并且我并不总是能够预测何时需要这些信息.并且 - 为了抽象起见 - 我可能不希望该方法将东西输出到特定于应用程序的日志(该方法可以在不同的程序中使用),或者像上面的其他层一样具有特定的依赖于应用程序的行为.
例如,在给定的实用程序函数中,我可能在执行操作之前有几个先决条件检查,但失败了.如果我对其中任何一个返回false,则调用者不知道发生了什么.如果我返回false并记录应用程序日志发生的事情,我将该函数绑定到特定于应用程序的行为.
问题是:实现一个名为MyResult的小类并使其返回响应状态(ok/false),消息,最终整数代码以及调用者可以调用的对象占位符(数组或对象)是好的/常见的实践访问返回的对象?这个MyResult类将在整个系统中使用,并且是所有方法与其调用者之间的常见"方言".然后,所有方法都会返回MyResult的实例.
有人可以详细解释为什么lock在C#中对任何类型的对象都有可能吗?
我理解它是什么lock以及如何使用它.我知道它如何扩展到Monitor.Enter/ Exit.我正在寻找实施细节和设计考虑因素的解释.
首先:引擎盖下发生了什么?例如:对象实例中是否有额外的位(就像RTTI/vtable那样)可以使它工作?或者在对象引用上键入某种查找表?(如果是这样,它如何与GC交互?)或其他什么?为什么我不必创建一个特定类型的实例来保存锁定数据?
(顺便说一下,在本机代码中做什么Enter和Exit映射到什么?)
其次,为什么 .NET设计为没有特定类型来取出锁定?(鉴于你通常只new object()为了这个目的而制作一个- 而且你锁定"任何旧对象"的大多数情况都是有问题的.)这个设计选择是否被实现细节强迫了?还是故意的?而且,如果是故意的,这是一个不错的选择吗?(我意识到第二部分可能需要推测.)
我正在使用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在我身上耍花招?
如何使用以下公共接口命名类:
/// <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) framework-design ×12
.net ×7
c# ×6
asp.net ×1
cil ×1
clr ×1
collections ×1
frameworks ×1
generics ×1
modularity ×1
node.js ×1
nuget ×1
php ×1
resharper ×1
session ×1