有什么区别Server.MapPath()和HostingEnvironment.MapPath()?是否Server.MapPath()有任何优势了HostingEnvironment.MapPath()?
我原来的问题是当服务器上的文件路径HttpContext不存在时映射,我无法将Server变量传递Global.asax给我的方法.
我用HostingEnvironment.MapPath()它代替,因为它不需要HttpContext.有这两种方法会产生不同结果的情况吗?
我听过很多关于函数式编程语言的知识,我很乐意学习它.我想这主要是为了好玩,但是,我希望它能提高我的编程技巧.
我主要是C#/ .NET背景,所以我的第一选择是学习F#(因为.NET和熟悉Visual Studio).另一方面,我想知道F#是否具有Lisp宏或Haskell高阶函数等功能.
你能比较F#,Haskell和Lisp吗?哪一个将是您选择的语言?
我正在寻找一个可以限制行数的javascript(通过行我的意思是用户在键盘上按Enter键结束的一些文本),用户可以在textarea中输入.我找到了一些解决方案,但它们根本不起作用或表现得很奇怪.最好的解决方案是一个可以完成工作的jquery插件 - 类似于CharLimit,但它应该能够限制文本行数而不是字符数.
我一直认为this在实例方法体内是不可能的.以下简单的程序表明它是可能的.这是一些记录在案的行为?
class Foo
{
public void Bar()
{
Debug.Assert(this == null);
}
}
public static void Test()
{
var action = (Action)Delegate.CreateDelegate(typeof (Action), null, typeof(Foo).GetMethod("Bar"));
action();
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
我同意答案,说明这种方法的记录方式.但是,我真的不明白这种行为.特别是因为它不是C#的设计方式.
我们收到了某人的报告(很可能是一个使用C#的.NET组(当时认为它还没有命名为C#))谁编写了一个在空指针上调用方法的代码,但是他们没有得到一个例外,因为该方法没有访问任何字段(即"this"为null,但方法中没有使用它).那个方法然后调用另一个方法,它确实使用了这一点并引发了一个异常,随后出现了一些令人头疼的问题.在他们弄清楚之后,他们给我们发了一张关于它的说明.我们认为能够在null实例上调用方法有点奇怪.Peter Golde做了一些测试,看看总是使用callvirt的性能影响是什么,它足够小,我们决定做出改变.
http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx
我想问一下System.String不包含无参数构造函数背后的想法是什么.
因此,当存在new()约束时,不能使用此类型.
UPDATE
为什么你认为新的string()是无用的,例如new int()没用.我真的看不出差异.我真的希望能够对字符串使用new()约束,因为我期待的是String.Empty.
UPDATE2
我知道int是一个值类型,所有值类型都有默认的无参数构造函数.我指的是@John Saunders的回答(和类似的答案),说明新的String()基本上没有做任何有用的事情.那么,如果新的String()并不意味着什么对新的int()有用呢?我也明白,值类型具有默认的无参数构造函数非常重要.更重要的是我认为字符串有一个默认的无参数构造函数真的很好.缺乏无参数构造函数对我来说意味着如果没有将初始化它的参数,对象就不会存在.在我看来,字符串不需要任何参数,因为它可能是空的.我问了这个问题,因为我想知道是否有一些重要的原因让字符串没有无参数构造函数,或者它只是设计或者其他.
UPDATE3
我想这将是最后一次更新,因为它看起来更像博客文章而非问题.在java中,字符串也是不可变的,新的String()是完全合法的.但是,无参数构造函数的文档说:
初始化新创建的String对象,使其表示空字符序列.请注意,由于字符串是不可变的,因此不必使用此构造函数.
UPDATE4
好的,最后更新;)我必须同意John Saunders.我使用的是具有new()约束的代码,它适用于自定义类.然后,我的同事需要更改int的代码,这没关系.然后将其更改为字符串,我们遇到了问题.当我想到它时,我想我们正在使用的代码需要改变以反映我们需要标量类型而不是具有无参数构造函数的类.所有这一切,我仍然认为你可以编写新的int()并且你无法编写新的string()(是的,我知道int是一种值类型;))有点不一致.谢谢你的所有答案!
在此先感谢您的帮助.
我编写了一个由多个类实现的接口.我想写一个Service类,它将所有注册的实现注入到它的ctor中.
我能想到的唯一解决方案是在ctor中调用服务定位器并要求它Resolve()所有实现.
理想情况下,我想要这样的东西 -
interface IVehicle
{
void Start();
}
class Car : IVehicle
{
public void Start()
{
Console.WriteLine("Car started.");
}
}
class Truck : IVehicle
{
public void Start()
{
Console.WriteLine("Truck started.");
}
}
class Motorbike : IVehicle
{
public void Start()
{
Console.WriteLine("Motorbike started.");
}
}
class VehicleService
{
// How do I inject all implementations of IVehicle?
public VehicleService(IEnumerable<IVehicle> vehicles)
{
foreach (var vehicle in vehicles)
{
vehicle.Start();
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑 - 我应该提到我正在使用Castle Windsor.
是否可以在C#中在运行时获取类摘要?我想通过反射获取课程摘要,然后将其写入控制台.通过类摘要我的意思是在类定义之前的摘要注释,如下所示:
/// <summary>
/// some description
/// </summary>
class SomeClass
{
}
Run Code Online (Sandbox Code Playgroud)
我不知道在编译代码后这些注释是否可用,但如果它们可能有一种方法可以在代码中获取它们.
在此先感谢您的帮助.
我有以下问题.我有一个包含大约40个项目的解决方案.有一个项目A引用了引用项目C的项目B.项目A中没有任何代码使用项目C中的类.但是,如果我在任何代码中使用任何LINQ扩展方法,例如:
var r = new int[] { 1, 2, 3 }.Where(a => a > 1);
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
somefile.cs(70,13):错误CS0012:类型"XXX"在未引用的程序集中定义.您必须添加对程序集'Project C程序集名称,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = xxx'的引用.
错误在使用linq扩展方法的行上.
我正在使用VS2010,.NET 3.5.
更新:每种扩展方法都会发生这种情况.我在同一个文件中创建了一个类,如下所示:
public static class SomeClass
{
public static int[] Test(this int[] a)
{
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我写这个代码和编译中断同样的错误:
new int[] { 1, 2, 3 }.Test();
Run Code Online (Sandbox Code Playgroud)
Update2:好的,我发现了导致错误的原因.但我不知道为什么.以下代码导致错误:
using System.Linq;
using B;
namespace TestApp
{
public class A
{
public void M()
{
var c = new string[] { "a", "b", "c" }.Where(s …Run Code Online (Sandbox Code Playgroud) c# linq compiler-construction extension-methods visual-studio
我想在我的WCF服务中检查客户端证书.
我的目标是只允许具有特定指纹证书的客户能够与我的服务进行通信.
我的WCF服务托管在IIS中,我使用basicHttpBinding和安全模式="transport",凭据类型为"Certificate".IIS需要客户端证书才能与服务进行通信.
在此先感谢您的帮助.
更新:我的配置:
<basicHttpBinding>
<binding
name="testBinding"
maxReceivedMessageSize="2147483647">
<readerQuotas
maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
Run Code Online (Sandbox Code Playgroud)
行为:
<serviceBehaviors>
<behavior name="SomeServiceBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="Custom" customCertificateValidatorType="SomeService.CustomCertificateValidator,SomeService" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
Run Code Online (Sandbox Code Playgroud)
服务配置:
<service
behaviorConfiguration="SomeServiceBehavior"
name="SomeService">
<endpoint
address=""
binding="basicHttpBinding"
bindingConfiguration="testBinding"
contract="ISomeService">
</endpoint>
</service>
Run Code Online (Sandbox Code Playgroud)
为了测试目的,我以这种方式实现了验证器:
public class CustomCertificateValidator : X509CertificateValidator
{
public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
{
throw new SecurityTokenValidationException("TEST Certificate was not issued by a trusted issuer TEST");
} …Run Code Online (Sandbox Code Playgroud) 读完这个问题后为什么"int"和"sbyte"GetHashCode函数生成不同的值?我想进一步挖掘并发现以下行为:
sbyte i = 1;
int j = 1;
object.Equals(i, j) //false (1)
object.Equals(j, i) //false (2)
i.Equals(j) //false (3)
j.Equals(i) //true (4)
i == j //true (5)
j == i //true (6)
i.GetHashCode() == j.GetHashCode() //false (7)
Run Code Online (Sandbox Code Playgroud)
如果两个对象不表示相同的对象引用且都不为null,则它调用objA.Equals(objB)并返回结果.这意味着如果objA重写Object.Equals(Object)方法,则调用此覆盖.
我很感兴趣,如果有人能解释为什么我认为在相当基本的.NET类型中观察到不一致的行为.