在Visual Studio 2010中,如果我创建一个WPF应用程序的新项目,则MainWindow子类将Window作为默认的第一个窗口提供.我一直在重命名的步骤MainWindow是:
MainWindow.xaml.MainWindow.xaml.cs.StartupUri的App.xaml相应.有没有更好的办法?:-)
当我运行这段代码时,Equation(10, 20)输出到控制台:
public class Equation
{
public int a;
public int b;
public override string ToString()
{ return "Equation(" + a + ", " + b + ")"; }
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new Equation() { a = 10, b = 20 });
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
我想支持Equation在测试中使用的实例,if所以我允许隐式转换为Boolean:
public class Equation
{
public int a;
public int b;
public override string ToString()
{ return "Equation(" + a + …Run Code Online (Sandbox Code Playgroud) F#接受以下内容:
type Abc =
member this.A = 10
Run Code Online (Sandbox Code Playgroud)
由于没有提供参数列表,因此没有默认构造函数.可以添加构造函数Abc吗?如果没有,可以做些Abc什么?
假设我们有以下内容multi sub:
multi sub abc(Int @array) { say 10, ' ', @array; }
multi sub abc(Array[Int] @array) { say 20, ' ', @array; }
multi sub abc(Str @array) { say 30, ' ', @array; }
multi sub abc(Array[Str] @array) { say 40, ' ', @array; }
Run Code Online (Sandbox Code Playgroud)
正如这个问题中提到的,使用类型化数组调用它们可能会变得冗长:
abc Array[Int].new([1,2,3]);
abc Array[Array[Int]].new([Array[Int].new([1,2,3]), Array[Int].new([2,3,4])]);
Run Code Online (Sandbox Code Playgroud)
如果可以从文字中推断出类型,这样我们就可以做这样的事情,那就太好了:
abc typed([1,2,3]);
abc typed([[1,2,3],[2,3,4]]);
abc typed(['a', 'b', 'c']);
abc typed([['a', 'b', 'c'], ['b', 'c', 'd']]);
Run Code Online (Sandbox Code Playgroud)
更进一步,让我们添加一个子句来为我们进行类型推断:
multi sub abc(@array) { abc typed(@array); } …Run Code Online (Sandbox Code Playgroud) HashSet 不对默认相等操作使用设置相等语义。
var a = new HashSet<int> { 1, 2, 3 };
var b = new HashSet<int> { 3, 2, 1 };
Run Code Online (Sandbox Code Playgroud)
这评估为false:
var c = a == b;
Run Code Online (Sandbox Code Playgroud)
而在数学意义上,这两个集合是相等的。我们当然可以使用SetEquals显式来使用集合相等进行比较:
var d = a.SetEquals(b); // true
Run Code Online (Sandbox Code Playgroud)
如果我们创建一组这些集合:
var e = new HashSet<HashSet<int>> { a, b };
Run Code Online (Sandbox Code Playgroud)
结果包含两个元素。我们需要传递一个自定义比较器来获取父集的集语义。
这是HashSet默认情况下实现集合语义的子类。
public sealed class MathSet<T> : HashSet<T>, IEquatable<MathSet<T>>
{
public override int GetHashCode() => this.Select(elt => elt.GetHashCode()).Sum().GetHashCode();
public bool Equals(MathSet<T> obj) => SetEquals(obj);
public override bool Equals(object …Run Code Online (Sandbox Code Playgroud) 假设我有项目A和项目B。项目A依赖于项目B。因此A通常会直接引用B的 DLL。
然后我决定将B作为 nuget 包发布。现在,A通过 nuget 而不是本地 DLL引用了B。
这种安排的缺点是,如果我更新B,我需要上传一个新的 nuget 并等待它可用才能从A使用它。
我发现在更新A对B的引用时可以指向本地 nuget 包,这样确实有一点帮助。但是,如果我对B进行更改,我仍然需要执行生成新包并更新A对包的引用的步骤,然后A才能看到更改。通过 pre-nuget 安排,我只需构建B,A就会看到更改。
另一种方法是在进行本地开发时删除A对B的 nuget 包的引用并恢复为指向本地 DLL。但是,如果A发布到 github,则在推送到 github 之前必须将引用恢复为 nuget 引用。
在这种情况下,最佳做法是什么?当然,随着 github 和 nuget 的广泛使用,很多人都在处理这类事情。
更新
这个主题在 C# subreddit 上进行了讨论,并指出了一些有趣的方法。
为了测试 IHP,我已将Contoso University ASP.NET Core 教程的部分内容转换为 IHP。
\n本教程中的这一步显示了数据模型图。根据该页面,我在这个问题中重点关注的部分涉及Instructor和 ,OfficeAssignment其中 和 具有一对零或一的关系。
C# 中的模型Instructor是:
public class Instructor\n{\n public int ID { get; set; }\n\n [Required]\n [Display(Name = "Last Name")]\n [StringLength(50)]\n public string LastName { get; set; }\n\n [Required]\n [Column("FirstName")]\n [Display(Name = "First Name")]\n [StringLength(50)]\n public string FirstMidName { get; set; }\n\n [DataType(DataType.Date)]\n [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]\n [Display(Name = "Hire Date")]\n public DateTime …Run Code Online (Sandbox Code Playgroud) 考虑一下Chez Scheme代码的这一点:
(进口(chezscheme))
(定义(list-enumerate ls val proc)
(让循环((ls ls)(返回?#f)(val val))
(如果(或(空?ls)
返回?)
值
(值调用(lambda()(proc val(car ls)))
(lambda(返回值)
(循环(cdr ls)return?val))))))
(定义(list-index ls proc)
(列表枚举ls
0
(lambda(i elt)
(如果(proc elt)
(值#ti)
(值#f(+ i 1))))))
(定义n 100000)
(定义数据(iota n))
(时间(列表索引数据(lambda(elt)(= elt(-n 1)))))
运行:
〜$ scheme-脚本〜/ scratch / _list-enumerate-allocation-test-chez-a.sps
(时间(列表索引数据...))
没有收藏
经过3 ms的cpu时间
实时经过4毫秒
分配了8个字节
哇,它报告只分配了8个字节。
让我们使用--program选项而不是再次运行它--script:
〜$ scheme-程序〜/ scratch / _list-enumerate-allocation-test-chez-a.sps
(时间(列表索引数据...))
没有收藏
经过3 ms的cpu时间
实时经过3毫秒
分配了800000字节
Yikes,分配了800000字节。
有什么区别?
埃德
鉴于:
open System.Linq
Run Code Online (Sandbox Code Playgroud)
这是一个可以接受的表达:
[2; 3; 4].SelectMany(fun n -> { 1..n })
Run Code Online (Sandbox Code Playgroud)
但这不是:
[2; 3; 4].SelectMany(fun n -> [ 1..n ])
Run Code Online (Sandbox Code Playgroud)
错误消息说:
int -> int list
is not compatible with type
int -> System.Collections.Generic.IEnumerable<'a>
Run Code Online (Sandbox Code Playgroud)
F#拒绝表达式,因为函数返回了一个int list.
考虑一下这个类似的C#程序:
using System;
using System.Collections.Generic;
using System.Linq;
namespace SelectManyCs
{
class Program
{
static List<int> Iota(int n)
{
var ls = new List<int>();
for (var i = 0; i < n; i++) ls.Add(i);
return ls;
}
static void Main(string[] args)
{
var …Run Code Online (Sandbox Code Playgroud) 以下命令:
Get-ChildItem | Get-Member
System.IO.DirectoryInfo表明 和上当然有很多属性System.IO.FileInfo。
但是,当以交互方式运行时,仅显示属性Mode、LastWriteTime、Length和。这些也是通过管道传输到或Name时显示的属性。Get-ChildItemFormat-TableOut-GridView
我的问题是,有没有办法以编程方式获取任何给定对象的这些默认属性的名称?即像这样:
Get-DefaultProperties @(Get-ChildItem)[0]
Run Code Online (Sandbox Code Playgroud)
应在数组中返回以下内容:Mode LastWriteTime Length Name