如果我做一个查询,订购如下的元素,我得到升序.
var i = from a in new int[] { 1, 2, 3, 4, 5 }
orderby a
select a;
Run Code Online (Sandbox Code Playgroud)
如果我添加ascending关键字我得到相同的结果.
var i = from a in new int[] { 1, 2, 3, 4, 5 }
orderby a ascending
select a;
Run Code Online (Sandbox Code Playgroud)
我认识到ascending在第二个示例中添加关键字可以提高可读性,因为它不需要知道默认顺序orderby.
该ascending关键字是否还有其他原因存在?
我也有兴趣知道为什么这个(突破性变化?)只是用于一个特定情况.
编辑:请参阅下面的评论,@ Joe指出,这不是一个重大变化,因为它是一个上下文关键字.
我想编写一个规则,如果在由特定属性标记的方法调用的任何方法中进行对象分配,则该规则将失败.
到目前为止,我已经完成了这项工作,通过迭代调用我的方法来检查使用的所有方法CallGraph.CallersFor(),看看这些父方法中是否有任何属性.
这适用于检查与要检查的方法相同的程序集中的父方法,但是在线阅读时,似乎一次CallGraph.CallersFor()确实查看了所有程序集,但现在却没有.
问题:有没有办法获取调用给定方法的方法列表,包括那些在不同程序集中的方法?
替代答案:如果无法实现上述目标,我如何遍历给定方法调用的每个方法,包括不同程序集中的方法.
例:
-----In Assembly A
public class ClassA
{
public MethodA()
{
MethodB();
}
public MethodB()
{
object o = new object(); // Allocation i want to break the rule
// Currently my rule walks up the call tree,
// checking for a calling method with the NoAllocationsAllowed attribute.
// Problem is, because of the different assemblies,
// it can't go from ClassA.MethodA to ClassB.MethodB.
}
}
----In Assembly B …Run Code Online (Sandbox Code Playgroud) 考虑以下课程:
public class DerivedClassPool<TBase> where TBase : class
{
public TBase Get(Type componentType)
{
// Not important, but you get the idea
return Activator.CreateInstance(componentType) as TBase;
}
public TDerived SomeMethod<TDerived>() where TDerived : TBase
{
return Get(typeof(TBase)) as TDerived;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已经将TBase泛型类参数限制为一个类:where TBase : class
我还将TDerived泛型方法参数限制为TBase或从中派生出来的东西:where TDerived : TBase.
我在线上收到错误as TDerived:
类型参数'TDerived'不能与'as'运算符一起使用,因为它没有类类型约束,也没有'class'约束
我明白为了防止错误我需要添加约束class,所以我得到:
where TDerived : class, TBase
Run Code Online (Sandbox Code Playgroud)
当TBase已经被限制为一个类并且TDerived被限制为一个类TBase或从它派生时,为什么我必须这样做?
我想在一台PC上模拟网络类型的流.
我通过创建一个Stream接收2个底层流,一个读取和另一个读取来完成此操作.
然后我创建了这个类的2个实例交换2个流.目前我使用MemoryStreams作为2个底层流.
我现在遇到的麻烦是,如果我将X字节写入a,MemoryStream那么它的位置将是X,如果我然后做了一个Read我得不到数据,因为我在流的末尾.
鉴于我通常会进行一些读/写操作(因此不能在每次写入后将位置重置为0)我Stream可以使用什么来获取此行为?
实际上,我想要一种字节队列,我可以以流的形式写入和读取.
ie(忽略实际的方法参数)
MyStream.Write({ 1, 2, 3, 4, 5, 6 });
MyStream.Write({ 7, 8 });
MyStream.Read(3) // Returns { 1, 2, 3 }
MyStream.Read(4) // Returns { 4, 5, 6, 7 }
Run Code Online (Sandbox Code Playgroud) 背景:我正在为xbox开发,并处于启动阶段.我需要减少对象分配.一个开始的地方是找出(un)拳击发生的地方.
我是IL的新手(因为我从未查看过任何内容!)并且希望避免通过反汇编程序运行DLL,寻找(un)box命令然后尝试找出它涉及的代码行.
问题:是否有任何工具可以报告此类事件(发生(联合国)拳击事件)?
将GC堆转储绑定到对象创建发生的代码行的方法有很多很多奖励点!
我仍然试图让我的FxCop规则正常工作.
作为其中的一部分,我需要弄清楚方法调用的方法.以前我正在使用CallGraph.CallersFor()(反过来做,这是我最后的目标),但它似乎有我在下面描述的相同问题.
作为使用CallGraph该类的替代方法,我尝试访问所有方法调用来构建字典,基于以下代码:
public override void VisitMethodCall(MethodCall call)
{
Method CalledMethod = (call.Callee as MemberBinding).BoundMember as Method;
// ....
}
Run Code Online (Sandbox Code Playgroud)
但是,事实证明,如果被调用的方法在覆盖基类的方法的派生类上,那么它BoundMember是基类'方法,而不是子类'方法(实际上将被调用的方法).
问题:如何获得在FxCop中使用callvirt IL指令时将调用的方法?
我正在使用ILSpy探索 XNA框架中的几个dll,并遇到了这个问题:
class KerningHelper
{
private void !KerningHelper()
{
((IDisposable)this).Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的感叹号是什么?这是ILSpy或其他问题吗?
注意,该类有一个单独的析构函数:private unsafe void ~KerningHelper().
我有一个控制器和动作,负责处理403s,因为用户没有正确的角色.它可以访问RequestContext导致异常的原始文件.
我希望能够做的是用我们的行为描述装饰我的行为,然后允许用户通知他们的经理,请求访问,包括电子邮件中的描述.
那么,我怎么能弄清楚给定的动作是什么RequestContext?
显然,将控制器和动作名称排除在外是比较复杂的,RouteData因为通常会出现动作方法的重载等.
一旦我有了,MethodInfo那么很容易获得属性等.
我希望有一种方法可以通过通用方式从控制器获取视图以专注于特定的模型属性.
到目前为止我所拥有的是:
// To become an extension/base class method
private void FocusOnField<TModel, TProperty>(Expression<Func<TModel, TProperty>> fieldExpression)
{
ViewData["FieldToFocus"] = fieldExpression;
}
...
FocusOnField((ConcreteModelClass m) => m.MyProperty);
Run Code Online (Sandbox Code Playgroud)
public static class ViewPageExtensions
{
public static MvcHtmlString FocusScript<TModel>(this ViewPage<TModel> viewPage)
{
if (viewPage.ViewData["FieldToFocus"] != null)
{
return MvcHtmlString.Create(
@"<script type=""text/javascript"" language=""javascript"">
$(document).ready(function() {
setTimeout(function() {
$('#" + viewPage.Html.IdFor((System.Linq.Expressions.Expression<Func<TModel, object>>)viewPage.ViewData["FieldToFocus"]) + @"').focus();
}, 500);
});
</script>");
}
else
{
return MvcHtmlString.Empty;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在面临的问题是,在视图的FocusScript方法中,我不知道要关注的属性的返回类型,并且(System.Linq.Expressions.Expression<Func<TModel, object>>)对于任何不返回对象的属性,转换为失败.
我不能只为属性添加第二个泛型参数,因为我不知道控制器要我关注的属性的返回类型是什么.
如何FocusScript …
我正在尝试Texture2D使用默认导入程序(XML内容)加载包含xml文件的自定义类,而不使用处理器.
大量的在线研究和大量处理其他错误的研究引导我使用这种XML:
<?xml version="1.0" encoding="utf-16"?>
<XnaContent xmlns:Components="Entities.Components">
<Asset Type="EntitiesContentPipeline.EntityTemplateContent">
<Name>entity name</Name>
<TestTexture>
<Reference>#External1</Reference>
</TestTexture>
</Asset>
<ExternalReferences>
<ExternalReference ID="#External1" TargetType="Microsoft.Xna.Framework.Graphics.Texture2D">C:\Documents and Settings\GDuckett\My Documents\Visual Studio 2010\Projects\Gravitron\Gravitron\Gravitron\bin\x86\Debug\Content\Bullet.xnb</ExternalReference>
</ExternalReferences>
</XnaContent>
Run Code Online (Sandbox Code Playgroud)
是的,我也不喜欢硬编码的路径,但是如果我能够在没有自定义阅读器的情况下工作,或者每个包含Texture2Di的类型的编写者都可以使用它.
下面是我的类的内容版本(由管道使用):
[ContentSerializerRuntimeType("Entities.Content.EntityTemplate, Entities")]
public class EntityTemplateContent
{
public string Name;
public ExternalReference<Texture2D> TestTexture;
public EntityTemplateContent()
{
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的运行时版本:
public class EntityTemplate
{
public string Name;
public Texture2D TestTexture;
public EntityTemplate()
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试var test = Content.Load<EntityTemplate>("BulletTemplate");下面做的是我得到的错误:
加载"Bullet"时出错.ContentTypeReader Microsoft.Xna.Framework.Content.Texture2DReader,Microsoft.Xna.Framework.Graphics,Version = 4.0.0.0,Culture = neutral,PublicKeyToken …
c# ×10
.net ×2
fxcop ×2
generics ×2
inheritance ×2
asp.net-mvc ×1
boxing ×1
call-graph ×1
destructor ×1
ilspy ×1
keyword ×1
linq ×1
sql-order-by ×1
stream ×1
syntax ×1
unboxing ×1
xna ×1
xna-4.0 ×1