我有一些实体类型,我想懒惰加载.但是,它们有一些内部(汇编)字段,但不在该类之外使用.这些字段是编译器生成的(F#),我无法更改它们.示例例外是:
NHibernate.InvalidProxyTypeException:以下类型不能用作代理:Mappings.MTest:field id @ 47不应该是公共的也不是内部的
我理解为什么NHibernate会这样做,以及如果有字段,如果我访问它们会弄乱生成的代理的延迟加载属性.但是,既然我知道我不会使用这些字段,我能以某种方式覆盖NHibernate吗?
有什么方法可以说"忽略这个领域"吗?我正在使用Fluent NHibernate,如果这样可以更容易.
编辑:我还应该注意,我正在使用NHibernate 2.1.0 Alpha 2.
Edit2:这里的主要要点是我想保持LazyLoading,这意味着我必须使用代理生成.禁用LazyLoading工作(没有代理),但sorta失败了像NHibernate这样的好框架的目的.
我有一些代码可以对64位整数进行大量的比较,但是它必须考虑数字的长度,就像它被格式化为字符串一样.我无法更改调用代码,只能更改函数.
最简单的方法(除了.ToString().Length)是:
(int)Math.Truncate(Math.Log10(x)) + 1;
Run Code Online (Sandbox Code Playgroud)
然而,这表现得相当糟糕.由于我的应用程序只发送正值,并且长度相当均匀地分布在2到9之间(偏向9),我预先计算了值并使用if语句:
static int getLen(long x) {
if (x < 1000000) {
if (x < 100) return 2;
if (x < 1000) return 3;
if (x < 10000) return 4;
if (x < 100000) return 5;
return 6;
} else {
if (x < 10000000) return 7;
if (x < 100000000) return 8;
if (x < 1000000000) return 9;
return (int)Math.Truncate(Math.Log10(x)) + 1; // Very uncommon
}
}
Run Code Online (Sandbox Code Playgroud)
这样可以用平均4个比较来计算长度.
那么,我有什么其他技巧可以让这个功能更快吗?
编辑:这将作为32位代码(Silverlight)运行.
更新:
我采纳了Norman的建议并且稍微改变了ifs,导致平均只有3个比较.根据Sean的评论,我删除了Math.Truncate.总之,这促进了大约10%的事情.谢谢!
很多时候我听说F#不适合特定的任务,比如UI."使用正确的工具"是一个常见的短语.
除了缺少WinForms/WPF/ORM设计器等工具之外,我不确定F#究竟缺少什么 - 老实说!然而,特别是在UI方面,我被告知C#做得更好.那么,在强制使用F#时,F#的实际差异和遗漏是什么?
这是我提出的列表:
大量缺少工具支持
F#仍然是测试版
你的开发人员不知道F#
Mutables需要"可变"或需要ref,ref需要!解除引用
Mutables赋值< - 和ref使用:=(它们都是1个字符而不仅仅是=)
val需要DefaultValueAttribute来获取默认值
F#不会发出隐式接口
受保护的成员更难以处理
没有自动属性
抽象类上实现的虚拟成员需要两个定义
引用到LINQ-Expression-Trees会产生与C#/ VB略有不同的树(对于期望以特定格式表达其表达式的API而言很烦人)
没有stackalloc
F#没有?:条件运算符
F#中的指针可能被认为更麻烦
代表/事件有可能会被认为是比较烦琐(我认为他们是更容易,但至少它们是不同的)
没有自动类型转换(比如int to float或者隐式转换)
Nullable没有特殊的语法支持(C#的?类型注释和??运算符,以及在nullables上使用运算符.)
没有自动向上扩展到普通基类或装箱(例如:让x:obj =如果为真,那么其他为"hi"//这不会是类型检查)
没有警告就不能丢弃值("忽略"以解决它)
没有C风格的语法:)
问题:哪些是编写命令式或OO代码的障碍?为什么(简短的例子)?我错过了哪些?什么是最好的解决方法,为什么他们还不够?
请注意,我不是在谈论编写所谓的惯用F#,我当然不是在谈论函数式编程.我更感兴趣的是"如果我强迫自己在F#中编写UI或命令式/ OO代码,使用F#OO /命令式功能和类类型,会有什么最大的伤害?"
奖金 如果您不了解F#但使用C#或VB.NET并认为它是某种情况下更好的工具,请指出您觉得有吸引力的特定语言功能和语法.
我想知道是否有任何相对简单的方法来扩展NHibernate以支持F#的歧视联盟.不仅仅是单个IUserType或ICompositeUserType,而是一些通用的东西,无论DU的实际内容如何,我都可以重复使用.
例如,假设我有一个名为RequestInfo的属性,它是一个定义为的联合:
type RequestInfo =
| Id of int
| Name of string
Run Code Online (Sandbox Code Playgroud)
这将编译为一个抽象的RequestInfo类,具有具体的子类Id和Name.我可以通过F#反射得到所有这些信息.在这种情况下,我可以使用"RequestInfo_Tag","RequestInfo_Id","RequestInfo_Name"将其存储在数据库中.
因为我是NHibernate的新手,我会遇到什么样的问题试图遵循这种方法?更复杂的案件是不可能处理的?例如,嵌套的歧视联盟呢?有没有办法可以将其他联盟的读取"移交"到另一个ICompositeUserType?
更重要的是,这会搞砸我的查询功能吗?意思是,我是否必须知道DB中的实际列名; 我将无法执行Criteria.Eq(SomeDiscUnion)并将其全部整理出来?
我不是在寻找一个完整的"提供代码"的答案,只是一些一般的建议,如果这是值得追求的(以及如何),或者我应该重新考虑我的模型.
谢谢!
PS不要太粗鲁,但如果你的答案是"使用C#",那就不是很有帮助了.
C#编译器似乎明确地记下了它的所有接口,并且它的基类实现了.CLI规范说这不是必要的.我已经看到其他一些编译器没有明确地发出它,它似乎工作正常.C#是否有这样的差异或原因?
底部的C#为B生成的MSIL是:
.class private auto ansi beforefieldinit B
extends A
implements IAdvanced,
ISimple
Run Code Online (Sandbox Code Playgroud)
它不需要指定ISimple,因为A和IAdvanced一样实现它.C#代码:
interface ISimple {
int Basic { get; }
int Zero { get; }
}
interface IAdvanced : ISimple {
string Major { get; }
}
class A : ISimple {
int ISimple.Basic {
get { return 1; }
}
int ISimple.Zero {
get{ return 0;}
}
}
class B : A, IAdvanced {
string IAdvanced.Major {
get { return "B"; }
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试从F#编译代码以在Silverlight中使用.我编译:
--noframework --cliroot"C:\ program Files\Microsoft Silverlight\2.0.31005.0" - standalone
这将生成一个引用SL框架的独立程序集.但是当我尝试添加对生成的程序集的引用时,我收到此错误:
您只能在解决方案中向项目引用添加其他Silverlight项目.
什么是VS插件来确定这不是Silverlight程序集?这是清单:
// Metadata version: v2.0.50727
.assembly extern mscorlib
{
.publickeytoken = (7C EC 85 D7 BE A7 79 8E ) // |.....y.
.ver 2:0:5:0
}
.assembly FSSLLibrary1
{
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module 'F#-Module-FSSLLibrary1'
// MVID: {49038883-5D18-7281-A745-038383880349}
.imagebase …Run Code Online (Sandbox Code Playgroud) 我有一个普通的SLN文件,我正在使用msbuild从命令行编译它.我这样做:
C:\ slndir> msbuild/p:OutDir = C:\ slnbin \
并且它将所有内容转储到C:\ slnbin中,除了网站,它们被部署到C:\ slnbin_PublishedWebsites \.
我想要的是不仅将所有二进制文件都放在bin目录中,而且每个可执行程序都有自己的"部署"文件夹,类似于每个网站获得的.
所以,例如,如果我有以下项目: - Common - Lib1 - Service1 - Lib2 - Service2
我想得到:
C:\slnbin\ // Everything
C:\slbin\Deploy\Service1 // Common, Lib1, Service1
C:\slbin\Deploy\Service2 // Common, Lib2, Service2
Run Code Online (Sandbox Code Playgroud)
我尝试过像"msbuild/p:OutDir = C:\ slnbin\$(ProjectName)"这样的东西,但它只是将它视为文字并创建一个实际的"$(ProjectName)"子目录.
我不需要修改每个项目等等.
这可能吗?简单?
有没有人有任何关于获得当前版本的ASP.NET MVC(预览5)在Mono 2.0上工作的信息?有旧版本的信息(预览2,也许预览3),但我没有看到有关使预览5实际工作的细节.
在Mono项目的路线图显示ASP.NET 3.5(明年)单声道2.4.有关如何在此之前获得此功能的任何想法?
更多细节:基本的MVC Preview 5模板似乎可以工作,只要我避开根目录.如果我请求root,我得到:
Server Error in '/' Application
The virtual path '' maps to another application.
Description: HTTP 500. Error processing request.
Stack Trace:
System.Web.HttpException: The virtual path '' maps to another application.
at System.Web.HttpContext.RewritePath (System.String filePath, System.String pathInfo, System.String queryString, Boolean setClientFilePath) [0x00000]
at System.Web.HttpContext.RewritePath (System.String path, Boolean rebaseClientPath) [0x00000]
at System.Web.HttpContext.RewritePath (System.String path) [0x00000]
at MvcApplication1._Default.Page_Load (System.Object sender, System.EventArgs e) [0x00000]
at System.Web.UI.Control.OnLoad (System.EventArgs e) [0x00000]
at System.Web.UI.Control.LoadRecursive () [0x00000]
at …Run Code Online (Sandbox Code Playgroud) 我知道我可以下载"April CTP"来获得.NET 2.0的F#2.0.但我需要FSC和F#Interactive for .NET 4.0.在安装了VS 2010的计算机上,它最终位于C:\ Program Files(x86)\ Microsoft F#\ v4.0中.这有可再分发的吗?
我很想知道Lambda(当用作委托时)是否会在每次调用时创建一个新实例,或者编译器是否会找到一种方法来实例化该委托只有一次并传入该实例.
更具体地说,我想为XNA游戏创建一个API,我可以使用lambda来传递自定义回调.由于这将在Update方法中调用(每秒调用很多次),如果它每次都新建一个实例以传递委托,那将是非常糟糕的.
InputManager.GamePads.ButtonPressed(Buttons.A, s => s.MoveToScreen<NextScreen>());
Run Code Online (Sandbox Code Playgroud) f# ×5
c# ×4
.net ×2
nhibernate ×2
asp.net-mvc ×1
cil ×1
clr ×1
integer ×1
lambda ×1
mono ×1
msbuild ×1
oop ×1
performance ×1
reference ×1
silverlight ×1
xna ×1