我希望在Windows Vista/2008计算机上从Java创建符号链接(软链接).我很高兴我需要呼吁JNI这样做.我虽然在实际的C代码上寻求帮助.创建链接的适当系统调用是什么?关于这个主题的一些好的文件的指针将非常感谢.
我偶然发现了一些令人费解的事情System.getProperty("os.name").根据关于此事的Java漏洞和Java 5发行说明(搜索"os.name"),Java中存在一个早期"longhorn"版本的Vista中的错误,应该已在v5版本10中修复.
但是在我的Vista SP1盒子上 - 使用v5版本15和v6版本6 - System.getProperty("os.name")返回"Windows XP".进一步System.getProperty("os.version")返回"5.1".但是,我无法通过Google找到与此问题相关的任何内容.这让我想知道我的Vista设置是否有些奇怪.我试过从测试C程序调用GetVersionEx()API函数,它返回主要版本6,次要0(正如我期望的Vista安装).
有没有其他人遇到这个问题,知道修复或有任何建议我如何解决它而不使用JNI?
我有以下C#方法:
private static bool IsLink(string shortcutFilename)
{
var pathOnly = Path.GetDirectoryName(shortcutFilename);
var filenameOnly = Path.GetFileName(shortcutFilename);
var shell = new Shell32.Shell();
var folder = shell.NameSpace(pathOnly);
var folderItem = folder.ParseName(filenameOnly);
return folderItem != null && folderItem.IsLink;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将其转换为F#:
let private isLink filename =
let pathOnly = Path.GetDirectoryName(filename)
let filenameOnly = Path.GetFileName(filename)
let shell = new Shell32.Shell()
let folder = shell.NameSpace(pathOnly)
let folderItem = folder.ParseName(filenameOnly)
folderItem <> null && folderItem.IsLink
Run Code Online (Sandbox Code Playgroud)
然而,它报告该let shell = new Shell32.Shell()行的错误,说new不能在接口类型上使用.
我刚刚犯了一个愚蠢的语法错误,还是需要从F#访问COM所需的额外工作?
有没有什么区别:
foo is null和foo == null?
假设我有一个由黑白RGB像素组成的图像,具有不同的透明度.然后,我想使用GDI +来维持所有像素的透明度级别,并将黑色像素转换为红色,使白色像素不受影响.
我认为色彩图看起来像:
|0 0 0 0 0|
|0 0 0 0 0|
|0 0 0 0 0|
|0 0 0 1 0|
|1 0 0 0 1|
Run Code Online (Sandbox Code Playgroud)
但是,如果不依次循环每个像素并测试其颜色,我可以将该地图仅应用于黑色像素吗?
在C#及其表兄语言中我们总是使用
public string SomeString { get; set;}
Run Code Online (Sandbox Code Playgroud)
但你也可以使用(我最近才发现这一点,而在编译器时鬼混)
public string SomeString { set; get; }
Run Code Online (Sandbox Code Playgroud)
我没有任何正式的编程培训,一切都是自我思考的.我一直在使用,{ get; set; }没有任何想法,就像我们一样只是一个约定1 + 1 = 2的顺序{ get; set; }或者是否有必要保持这个顺序,或者它是C历史的过去时代的残余,就像我们定义从正到负的传统电流的方式终端什么时候实际上是另一种方式?
我正在创建一些Roslyn分析仪,它们使用该AdditionFiles功能访问设置文件。我正在尝试测试分析仪是否正确使用此功能。
我有一种设置临时测试工作区的方法,并且我尝试通过两种途径添加其他文档:
private static Project CreateProject(IEnumerable<string> sources)
{
var projectId = ProjectId.CreateNewId(TestProjectName);
var solution = new AdhocWorkspace()
.CurrentSolution
.AddProject(projectId, TestProjectName, TestProjectName, LanguageNames.CSharp)
.AddMetadataReference(projectId, CorlibReference)
.AddMetadataReference(projectId, SystemCoreReference)
.AddAdditionalDocument(DocumentInfo.Create(DocumentId.CreateNewId(projectId),
"arnolyzer.yaml",
filePath: @"..\..\arnolyzer.yaml"));
var count = 0;
foreach (var source in sources)
{
var newFileName = $"{DefaultFilePathPrefix}{count++}.{CSharpDefaultFileExt}";
var documentId = DocumentId.CreateNewId(projectId, newFileName);
solution = solution.AddDocument(documentId, newFileName, SourceText.From(source));
}
var settingsFileId = DocumentId.CreateNewId(projectId, "arnolyzer.yaml");
solution = solution.AddAdditionalDocument(settingsFileId, "arnolyzer.yaml", SourceText.From(@"..\..\arnolyzer.yaml"));
return solution.GetProject(projectId);
}
Run Code Online (Sandbox Code Playgroud)
检查Project实例,我可以看到已经添加了两个附加文档。
但是,在检查动作CompilationStartAnalysisContext.Options.AdditionalFiles内时为空。AnalysisContext.RegisterCompilationStartActionAdditionalFiles
有谁知道这种方法是否行得通,因此我在某处出错了?还是添加的其他文档Project …
在学习c#7时,我碰巧偶然发现Ref返回.下面的GetSingle方法在我学到的时候起作用,它在外面给我一个引用.但GetIns方法抛出了编译时错误.Unfortnately,我不能锻炼为何以及如何将这些GetIns从不同GetSingle.有人可以解释一下吗?
错误:表达式不能在此上下文中使用,因为它可能不是通过引用返回的.
请注意,其中一条评论建议将其作为副本.但是这个问题是集合的类型,这特别是在集合的成员和类型的属性之间.因此,我认为这是一个不同的问题
class Pro
{
static void Main()
{
var x = GetSingle(new int[] { 1, 2 });
Console.WriteLine(x);
}
static ref int GetSingle(int[] collection)
{
if (collection.Length > 0) return ref collection[0];
throw new IndexOutOfRangeException("Collection Parameter!");
}
static ref int GetIns(Shape s)
{
if (s.Area <= 0)
{
s.Area = 200;
return ref s.Area;
}
return ref s.Area;
}
struct Shape {public int Area{ get; set; }
}
Run Code Online (Sandbox Code Playgroud) 问题: 我试图手动验证一些c#对象,而Validator忽略了与字符串长度相关的验证.
测试用例: 扩展这个使用[Required]属性的例子,我也想验证字符串不是太长,如下所示.
public class Recipe
{
//[Required]
public string Name { get; set; }
[MaxLength(1)] public string difficulty = "a_string_that_is_too_long";
}
public static void Main(string[] args)
{
var recipe = new Recipe();
var context = new ValidationContext(recipe, serviceProvider: null, items: null);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(recipe, context, results);
if (!isValid)
{
foreach (var validationResult in results)
{
Console.WriteLine(validationResult.ErrorMessage);
}
} else {
Console.WriteLine("is valid");
}
}
Run Code Online (Sandbox Code Playgroud)
预期结果:错误:"难度太长."
实际结果: '有效' …
如果我定义一个简单的函数:
let myConcat a b =
a + "+" + b
Run Code Online (Sandbox Code Playgroud)
然后假设函数是F#中的第一类值,我希望能够myConcat像这样使用:
let result = myConcat "a" (fun () -> "b")
Run Code Online (Sandbox Code Playgroud)
它没有产生字符串"a + b",而是给出了以下错误:
error FS0002: This function takes too many arguments, or is used in a context where a function is not expected
Run Code Online (Sandbox Code Playgroud)
希望我只是让语法错误,但在我看来,函数不能真正用作F#中的值.谁能解释一下这里发生了什么?
编辑 为了进一步澄清我的要求,我可以拥有等效的C#代码:
public string myConcat(string a, string b) { return a + "+" + b; }
Run Code Online (Sandbox Code Playgroud)
如果我想在param b中传递"稍后调用函数",我必须这样做:
public string myConcat(string a, Action<string> b) { return a + "+" + b(); }
Run Code Online (Sandbox Code Playgroud)
或者我可以这样称呼它: …