C#:在将解决方案划分为名称空间和程序集时,是否有任何指导方针和最佳实践?名称空间通常应该嵌套,顶层名称空间中的最低级别和基础类是什么?一个程序集通常应该有一个名称空间吗?在一个名称空间中有多个程序集或在一个程序集中有多个名称空间是他们的任何陷阱.多个组件或非常大的组件是否有编译时/运行时间的惩罚?
我已经看到一些断言,Scala Enumeration不是类型安全的.它怎么不安全?它显然是类型安全的,因为你不能将一个Enumeration的值传递给不同的Enumeration.
Enumeration要避免哪些陷阱或缺点?
我想在宏中使用私有构造函数.此示例是一个正整数,但基本模式不仅可以用于其他数字类型(如偶数),还可以用于字符串派生类型(如电子邮件地址或目录名称).通过使构造函数为私有,用户被拒绝制作非法类型的机会.我有以下代码:
object PosInt
{
import language.experimental.macros
import reflect.runtime.universe._
import reflect.macros.Context
def op(inp: Int): Option[PosInt] = if (inp > 0) Some(new PosInt(inp)) else None
def apply(param: Int): PosInt = macro apply_impl
def apply_impl(c: Context)(param: c.Expr[Int]): c.Expr[PosInt] =
{
import c.universe._
param match {
case Expr(Literal(i)) if (i.value.asInstanceOf[Int] > 0) =>
case Expr(Literal(i)) if (i.value.asInstanceOf[Int] == 0) => c.abort(c.enclosingPosition, "0 is not a positive integer")
case Expr(Literal(i)) => c.abort(c.enclosingPosition, "is not a positive integer")
case _ => c.abort(c.enclosingPosition, "Not a Literal")
} …Run Code Online (Sandbox Code Playgroud) 在Odersky等人的Scala书中,他们说使用列表.我没有阅读书籍封面,但所有的例子似乎都使用了val List.据我所知,人们也鼓励在vars上使用vals.但是在大多数应用程序中,使用var List或val MutableList之间没有权衡.显然我们可以使用val List.但是使用大量var列表(或var Vectors等)是一种好习惯吗?
我对来自C#的Scala很新.那里我有很多:
public List<T> myList {get; private set;}
Run Code Online (Sandbox Code Playgroud)
如果C#内置不变性,很容易被声明为val的集合,因为集合本身在构造之后从未改变过,即使元素在其生命周期中被添加和减去.因此,声明var集合几乎感觉就像离不变性一样.
作为对答案和评论的回应,Scala的一个强大卖点是:它可以有许多好处,而不必像Lisp或Haskell那样完全改变编写代码的方式.
我已经检查了其他问题,令人惊讶的是,这个问题似乎没有被问到.使用Extension方法,接口提供有限但真正的实现多重继承.这带来了Diamond问题,与基于类的多重继承相同.为什么这比基于类的多重继承更好或更可接受,这么多人似乎觉得这么可怕?它实际上似乎是一种更糟糕的实现多重继承的方式,因为扩展方法不能进入接口本身,甚至不能进入实现接口的类,但最终可能分散在多个静态实用程序类中.
Eric Lippert在他的博客(2009年10月5日上午9:29)似乎对扩展属性的概念持开放态度,甚至提到了扩展事件,扩展操作符,扩展构造函数(也称为"工厂模式")的可能性.因此可以进一步扩展通过接口的实现.
编辑:为了阐明一个类是否继承了两个接口,这两个接口都具有相同名称和类型参数的扩展方法,那么如果在没有显式命名接口的情况下调用方法,则会产生编译错误.考虑到这一点,我错了,因为这不是钻石问题.然而,考虑到这一点提出了一个问题,即钻石问题与其他歧义相比有多重要?为什么Diamond问题是如此困难,以至于它不能用简单的编译错误来获取,就像接口扩展方法类碰撞并且不能隐式解析一样?即使在基于类的多重继承中,也可能存在非基于Diamond的成员签名冲突.
我一直在用C#编程,但对其类型系统的局限性感到沮丧.我了解Scala的第一件事就是Scala具有更高的kinded泛型.但即使在我查看了一些文章,博客条目和问题之后,我仍然不确定什么是更高级的通用仿制药.无论如何我写了一些编译好的Scala代码,这段代码是否使用更高的类型?
abstract class Descrip [T <: DTypes, GeomT[_ <: DTypes] <: GeomBase[_]](newGeom: NewGeom[GeomT])
{
type GeomType = GeomT[T]
val geomM: GeomT[T] = newGeom.apply[T]()
}
Run Code Online (Sandbox Code Playgroud)
然后我想也许我已经在使用更高级的kinded泛型.正如我所理解的那样,但是现在我明白了,在我听说过Scala之前,我已经很高兴地在C#中使用了更高级的类型.这个snipet使用更高级的kinded类型吗?
namespace ConsoleApplication3
{
class Class1<T>
{
List<List<T>> listlist;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,为了避免进一步的混淆,我认为对于Java,C#和Scala中的每一个,在更高级的类型,外卡和开放/部分开放类型的使用方面,它们允许澄清是有用的.由于C#和Scala之间的关键区别似乎是Scala允许使用通配符和开放类型,因为C#没有通配符,并且要求在使用之前关闭所有通用类型.我知道它们有些不同,但我认为将这些特性的存在与它们在C++模板中的等价物联系起来会很有用.
以下是正确的吗?此表已针对Alexey的回答进行了更正
Lang: Higher-kind Wild-card Open-types
Scala yes yes yes
C# no no no
Java no yes no
C++ yes yes yes
Run Code Online (Sandbox Code Playgroud) 我想在Scala中实现一个树.我的特定树使用Swing Split窗格来提供地理地图的多个视图.拆分窗格中的任何窗格本身都可以进一步划分以提供额外的视图.我是否正确地说TreeMap和TreeSet都没有提供Tree功能?如果我误解了这个,请原谅.它让我觉得应该有标准的树集合,并且继续重新发明轮子是不好的做法.是否有任何Tree实现可能是未来的Scala标准?
所有树有三种类型的元素:根,节点和叶子.叶子和节点必须只有父对象的引用.根节点和节点可以有多个子节点和叶子的引用.叶子零孩子.如果不删除子项,则无法删除节点和根.我可能错过了其他规则/约束.
这似乎足以证明标准集合的通用规范.我还建议,对于Root和Nodes只能有2个子节点或单个子节点的情况,应该有一个标准的子类集合.在我的特定情况下,这就是我想要的.
最初,我想使用2只小鼠进行具有单独指针和2只小鼠之间相互作用的应用(例如,选择矩形区域).后来我可能想在Windows中一般提供第二个指针.我认为通过使用第二只鼠标模拟手写笔可能是可能的.
我的主要问题是:我是否正确使用系统挂钩而不是RawInput,DirectInput或InputX?
如果使用系统挂钩我假设我需要使用WH_MOUSE_LL而不是WH_MOUSE,即使应用程序在一个线程上运行?我的首选语言是C#,但我再次假设使用DLL导入意味着我可以在C++或C中做任何可能的事情.
在下面的代码中使用2.10.0M3在Eclipse插件2.1.0中为2.10M3.我正在使用针对JVM 1.5的默认设置
class GeomBase[T <: DTypes] {
abstract class NewObjs {
def newHex(gridR: GridBase, coodI: Cood): gridR.HexRT
}
class GridBase {
selfGrid =>
type HexRT = HexG with T#HexTr
def uniformRect (init: NewObjs) {
val hexCood = Cood(2 ,2)
val hex: HexRT = init.newHex(selfGrid, hexCood)// won't compile
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
Description Resource Path Location Type type mismatch;
found: GeomBase.this.GridBase#HexG with T#HexTr
required: GridBase.this.HexRT (which expands to) GridBase.this.HexG with T#HexTr GeomBase.scala
Run Code Online (Sandbox Code Playgroud)
为什么编译器认为该方法返回类型投影GridBase#HexG应该是GridBase的这个特定实例?
编辑转移到更简单的代码类,以响应评论现在获得不同的错误消息.
package rStrat
class TestClass {
abstract class …Run Code Online (Sandbox Code Playgroud) 为什么无法打开泛型类型作为参数传递.我经常上课:
public class Example<T> where T: BaseClass
{
public int a {get; set;}
public List<T> mylist {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
让我们说BaseClass如下;
public BaseClass
{
public int num;
}
Run Code Online (Sandbox Code Playgroud)
然后我想要一种方法说:
public int MyArbitarySumMethod(Example example)//This won't compile Example not closed
{
int sum = 0;
foreach(BaseClass i in example.myList)//myList being infered as an IEnumerable
sum += i.num;
sum = sum * example.a;
return sum;
}
Run Code Online (Sandbox Code Playgroud)
然后我必须编写一个接口,只是为了将这一个类作为参数传递,如下所示:
public interface IExample
{
public int a {get; set;}
public IEnumerable<BaseClass> myIEnum {get;}
}
Run Code Online (Sandbox Code Playgroud)
然后必须将泛型类修改为:
public class …Run Code Online (Sandbox Code Playgroud) scala ×6
c# ×5
generics ×2
assemblies ×1
c++ ×1
collections ×1
enums ×1
immutability ×1
inheritance ×1
io ×1
java ×1
macros ×1
namespaces ×1
parameters ×1
windows ×1