小编Shi*_*mar的帖子

您将如何使用编译器即服务进行操作

看到我们可能会在下一个版本中获得这个功能,您认为自己能做什么或者想要使用此功能做些什么?

就个人而言,在代码生成期间(例如在MSBuild任务中),我有时希望能够在项目中查看代码,从而可以选择生成更好的代码(更多代码).

例如,如果我有一个具有部分方法的部分类,其中某个类型的参数被发送,那么在代码生成时我可以使用该信息生成更好的代码.

换句话说,我在编写代码时发布了我的"意图",我可以将代码生成器用于繁重的工作.

partial void InitCommandForStoredProc(ref DbCommand command, string storedProcName);
Run Code Online (Sandbox Code Playgroud)

在部分方法中给出此信息,我可以生成正确的代码.

那么你们都希望能够将Compiler作为一项服务做什么呢?

c# compiler-construction compiler-as-a-service roslyn

27
推荐指数
3
解决办法
3122
查看次数

属性和命名/可选构造函数参数不起作用

我有自定义属性,如下所示:

  [AttributeUsage(AttributeTargets.Field)]
  public class EnumDisplayAttribute : Attribute
  {
    public string Description { get; private set; }
    public string Code { get; private set; }

    public EnumDisplayAttribute(string description = null, string code = null)
    {
      Description = description;
      Code = code;
    }
  }
Run Code Online (Sandbox Code Playgroud)

两个构造函数参数都是可选的.

在像这样的字段上使用此属性时

  public enum TransactionType
  {
    [EnumDisplay(code: "B")] 
    Bill,
    [EnumDisplay(description: null, code: "C")]
    CashReceipt,
  }
Run Code Online (Sandbox Code Playgroud)

我没有在代码编辑器中看到任何波形,但我看到一个模糊的错误,没有任何文件行号列.错误消息是:

错误CS0182:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

单击该错误不会执行任何操作.也就是说,您不会导航到错误站点(显然,因为没有行号和列).

即使我像这样设置属性:

[EnumDisplay("This is a Bill")] 
Run Code Online (Sandbox Code Playgroud)

编译器不喜欢它.

实际上,我被迫提供两个参数(已命名或未命名),以便将此属性用作属性.

当然,如果我将此属性用作常规类,如下所示:

var enumDisplayAttribute = new EnumDisplayAttribute();
enumDisplayAttribute = new EnumDisplayAttribute(description: "This is a …
Run Code Online (Sandbox Code Playgroud)

c# custom-attributes

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

什么是.NET公共语言运行时的泛型实现

当你在C#(或一般的.NET)中使用泛型集合时,编译器基本上是否只需要为特定类型制作泛型集合的腿部工作开发人员.所以基本上...它只是节省了我们的工作?

现在我想到了,这不可能是正确的.因为没有泛型,我们以前必须在内部创建使用非泛型数组的集合,因此有装箱和拆箱(如果它是值类型的集合)等.

那么,如何在CIL中呈现泛型?当我们说我们想要一些通用的东西时,我们在做什么呢?我不一定想要CIL代码示例(虽然这样可以),我想知道编译器如何获取我们的泛型集合并呈现它们的概念.

谢谢!

PS我知道我可以用ildasm来看看这个,但我对CIL看起来仍然像中文,我还没准备好解决这个问题.我只想知道C#(以及我猜其他语言)如何在CIL中渲染以处理泛型的概念.

.net c# generics cil

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

欣赏优秀设计的价值

最近刚刚从校外或经过1 - 2年的经验与一群人(来自两家不同的公司)合作,我最初对他们对各种行业流行语和设计模式等的了解印象深刻.此外,他们每个人都有一个对OO设计原理和界面使用有很好的理解.

简而言之...... 在与他们合作的短短几天内,我发现事情并非像他们出现的那样.

让我来定义一些我将在这里使用的术语 知识 - 你在学校或书本或互联网上学到的东西等.

经验 - 你做某事的时间

技能 - 只有经验才能获得.这是获取技能(随着时间的推移)并知道如何应用你拥有的知识

我发现即使他们知道这些东西,他们也真的不知道如何应用这些知识.你将所有这些模式挥舞在你的脸上,但他们必须自己编写的任何代码都有它的基本缺陷.他们可以告诉你某种设计模式的优点,并且可以提出一些实现,但无法识别设计中的基本缺陷.

当然,我有一份"不知道他不知道的人 - 孔子 ".

每天晚上我都会花很多时间重复一遍白天所说的一切,试图了解谁在说什么和为什么,试图在训练或代码审查期间通过例子来弄清楚我能做些什么.但坦率地说,我很困惑.

大约2-3周后,我开始明白这一点.无论如何,问题首先1.你有没有经历过这样的事情?你是(或者你)是如何解决这个问题的?

我的结论是,要么学校做得不好,要么谷歌是他们的朋友,他们得到所有这些"知识"并认为他们知道.

但我觉得

  1. 为了能够识别和欣赏好的设计,我必须编写好的代码,......设计不是很好.与它斗争然后修复它以了解疼痛,因此认识到好的和坏的设计并欣赏它

  2. 实践和经验 - 你无法击败它.经验(以及经验的质量)带来了很多,你只是无法与知识或一点经验相匹配.

我经历过的其他一些事情:"为什么这是一个界面而不是基类" - 你会得到各种答案,但没有一个是正确的理由.

为什么这个设计模式而不是那个,或者忘记设计模式一分钟而只是设计(它们完全丢失 - 当你看到他们真正的设计编码技巧时)

过度工程 - 不认识它,也无法理解它们随着系统的发展可能成为维护的噩梦.我发现这是一个大问题.就好像一切都有可能改变一样.除了用于发送电子邮件的.NET框架中的各种类之外,发送电子邮件的简单过程还有3个类.

使用框架或语言中的所有新功能只是因为(我甚至在某些Microsoft源代码中看到了这个源代码可用的特定框架)

所以10年后,每个编写代码的人都会使用所有可能的设计模式使用所有花哨的框架或语言功能来编写它,这样"遗留"代码编写得很好并且设计得很好.或者是吗?你怎么看?

有没有人觉得从现在起10年后我们只会转移到另一种不同的粪便.Muck是分散在十几个代码文件中然后它曾经是因为现在我们已经有了类和所谓的松散耦合代码,但它只是一种不同的混乱,实际上更难清理?

oop design-patterns

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

类设计 - 具有通用后代的基类

我有以下课程

  class GridBase
  {
    public object DataSource { get; set; }
  }

  class GenericGrid<T> : GridBase
  {
    public new T DataSource { get; set; }
  }
Run Code Online (Sandbox Code Playgroud)

GridBase 和通用网格类都可以实例化,并且也可以从任一类派生。

这是否被认为是实现这种层次结构的正确/可接受的方法?或者你应该加倍努力并像下面这样实现它

  class GridBase
  {
    protected object dataSource;
    public object DataSource { get { return dataSource; } set { dataSource = value; } }
  }

  class GenericGrid<T> : GridBase
  {
    public new T DataSource { get { return (T)dataSource; } set { dataSource = value; } }
  }
Run Code Online (Sandbox Code Playgroud)

当在后代中重新引入属性时,这同样适用于非泛型类,我在这里仅使用一个泛型示例。

另一个案例和问题

  abstract class SomeBase …
Run Code Online (Sandbox Code Playgroud)

c# class-design

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

Ajax请求不是异步的

我有一个ajax问题:

foreach(ids as id){
  $.ajax({
    url:'script.php',
    data:'id='+id,
    cache:false,
  });
}
Run Code Online (Sandbox Code Playgroud)

如果我循环6次(在我的foreach循环中)我应该向服务器发出6个异步请求.但是在这种情况下,ajax调用是同步调用的,而不是异步调用的.任何人都知道为什么会这样?

ajax

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

分离界面的问题及实现

它是我第一次尝试在单独的头文件中分离类,但我收到一个错误.请帮助我.谢谢 代码:

我的主要功能:

#include <iostream>
#include <MyClass>
int MyClass::data;
int main()
{
    cout<<"data="<<MyClass::data;
    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

MyClass.h

#ifndef MyClass
#define <MyClass>
class MyClass
{
    static int data_;

};
#endif
Run Code Online (Sandbox Code Playgroud)

错误:致命错误C1083:无法打开包含文件:'MyClass.h':没有这样的文件或目录

c++ visual-studio-2008

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