C#4将包含一个新的dynamic关键字,它将动态语言功能引入C#.
您打算如何在自己的代码中使用它,您会提出什么样的模式?您当前项目的哪一部分将使您的代码更清晰或更简单,或启用您可能根本无法做到的事情(除了与IronRuby或IronPython等动态语言的明显互操作之外)?
PS:如果你不喜欢这个C#4,请避免负面评论.
编辑:重新发现问题.
动态的经典用法是大多数stackoverflow C#用户所熟知的.我想知道的是,如果你想到特定的新C#模式,可以有效地利用动态而不会失去太多的C#精神.
我一直试图想出一种方法来编写针对各种数据存储的通用存储库:
public interface IRepository
{
IQueryable<T> GetAll<T>();
void Save<T>(T item);
void Delete<T>(T item);
}
public class MemoryRepository : IRepository {...}
public class SqlRepository : IRepository {...}
Run Code Online (Sandbox Code Playgroud)
我想在每个中使用相同的POCO域类.我也在考虑类似的方法,每个域类都有自己的存储库:
public interface IRepository<T>
{
IQueryable<T> GetAll();
void Save(T item);
void Delete(T item);
}
public class MemoryCustomerRepository : IRepository {...}
public class SqlCustomerRepository : IRepository {...}
Run Code Online (Sandbox Code Playgroud)
我的问题:1)第一种方法是否可行?2)第二种方法是否有任何优势.
是否有任何理由在泛型中使用'T'?它是某种缩写吗?据我所知,一切正常.例如
public G Say<G>(){ ... }
Run Code Online (Sandbox Code Playgroud)
甚至
public Hello Say<Hello>(){ ... }
Run Code Online (Sandbox Code Playgroud) 我有一些代码依赖于没有内联的方法:
internal class MyClass : BaseClass
{
// should not be inlined
public void DoSomething(int id)
{
base.Execute(id);
}
}
public abstract class BaseClass : MarshallByRefObject
{
[MethodImpl(MethodImplOptions.NoInlining)]
protected void Execute(params object[] args)
{
// does a stack walk to find signature of calling method
}
}
Run Code Online (Sandbox Code Playgroud)
当然,只有在未内联DoSomething方法时,这才有效.这就是基类派生的原因MarshallByRefObject,它阻止了公共方法的内联.
它一直工作到现在,但我从.Net 4服务器得到了一个堆栈跟踪,显示堆栈行走到了DoSomething的调用者.
.Net 4内联是否更加聪明并且检测到MyClass是内部的并且没有机会被代理替换?
你最喜欢哪个?
假设我们有一个通用的Product表,它有一个ID,一个名称和一个类别的外键引用.您是否愿意将您的桌子命名为:
CREATE TABLE Products
(
ProductID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
CategoryID int NOT NULL FOREIGN KEY REFERENCES Categories(CategoryID),
ProductName varchar(200) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
使用列的显式命名(例如产品名称,产品 ID)或类似的东西:
CREATE TABLE Products
(
ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
CategoryID int NOT NULL FOREIGN KEY REFERENCES Categories(ID),
Name varchar(200) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
从我所看到的,.NET世界中的约定是明确的 - 样本倾向于使用第一个示例,而开源和RoR世界倾向于第二个示例.就个人而言,我发现第一眼看上去更容易阅读和理解: select p.ProductID, p.ProductName, c.CategoryName from Categories c inner join Products p on c.CategoryID = p.CategoryID对我来说似乎比自然更自然select p.ID AS ProductID, p.Name AS …
请注意以下代码.违规行已被注释掉.
interface I<R> { }
class C : I<int> { }
class Program
{
private static void function<T, R>(T t) where T : class, I<R>
{
}
static void Main(string[] args)
{
// function(new C()); // wont compile
function<C, int>(new C());
}
}
Run Code Online (Sandbox Code Playgroud)
我认为类型推断应该找出类型,因为参数T提供了第一种类型,而I<R>提供了第二种类型.
有没有办法重新设计功能,以便调用者可能不必指定类型?
我有一个xml文件,如下所示.我要做的是创建一个查询,只选择具有属性"Channel"和值"Automotive"的项目.
<item>
<title>Industries</title>
<category type="Channel">Automotive</category>
<category type="Type">Cars</category>
<category type="Token">Article</category>
<category type="SpecialToken">News</category>
<guid>637f0dd7-57a0-4001-8272-f0fba60feba1</guid>
</item>
Run Code Online (Sandbox Code Playgroud)
这是我的代码
var feeds = (from item in doc.Descendants("item")
where item.Element("category").Value == "Channel"
select new { }).ToList();
Run Code Online (Sandbox Code Playgroud)
我尝试使用item.attribute方法,但我无法获取Item中的值,只有属性Value"type"
有人可以帮我解决这个问题吗?
干杯,克里斯