CSharp Similarities and Differences
This document lists some basic differences between Nemerle and C# in a terse form. If you know Java or C++ it should still be fairly helpful.
Changes In Expressions
| C# | Nemerle | Remarks |
|---|---|---|
const int x = 3; |
def x : int = 3; |
Variables defined with def cannot be changed once defined. This is similar to readonlyor const in C# orfinal in Java. Most variables in Nemerle aren't explicitly typed like this. |
int x = 3; |
mutable x : int = 3; |
Variables defined with mutable can be changed once defined. Most variables in Nemerle aren't explicitly typed like this. |
var = 3; //Will compile. |
def = 3;//Will compile! |
Nemerle's type inference is lightyears ahead of C#'s. If there is clear evidence of a variable's type, there's a 99% chance Nemerle will infer it. |
int a = b = c; |
def a = c; |
The type of the assignment operator is void. |
value = cond ? var1 : var2; |
value = if(cond) var1 else var2 |
No ternary operator is needed as everything is an expression in Nemerle. The 'else' branch is mandatory here! (Don't panic! if-without-else has its own keyword.) |
Class myClass = new Class(parms); |
def myClass = Class(parms); |
Nemerle doesn't require new when calling a constructor. |
Book[] books = new Book[size]; |
def books = array(size) : array[Book]; |
Often the array type can be inferred and this is simplified; as in the next example. |
Book[] books = new Book[size]; |
def books = array(size); |
When the type can be inferred from context or later use (which is most of the time), you can drop the type declaration |
int[] numbers = {1, 2, 3};
|
def numbers = array[1, 2, 3]; |
Initializing an array. Without the arraykeyword this would create a list. |
int[,] numbers = new int[2,3]; |
def numbers = array(2,3) : array.[2][int]; |
Multidimensional array constructor. The type can usually be inferred from use and not declared. |
int[,] numbers = { {1,2,3}, {1,4,9} };
|
def numbers = [ [1,2,3], [1,4,9] ]; |
Multidimensional array initialization. |
new {Prop1 = 1; Prop2 = "string"}
|
using Nemerle.Extensions; |
Nemerle anonymous typesare a bit more flexible (e. g. can be generic or returned from a method). They must be imported from Nemerle.Extensions however. |
new Class {
|
Class() |
The Nemerle Object Modifier macro is more powerful. |
if(cond) |
when(cond) |
if without else is called when. Nemerle requiresif statements to be paired with elsefor clarity. |
if(!cond) |
unless(cond) |
In Nemerle,if(!cond) can use the clearerunless(cond)syntax. Of course,when(!cond) can also always be used. |
if (cond) |
match(cond){
|
Pattern Matchingprovides a clearer way of delegating control flow. |
if (cond) |
using Nemerle.Imperative; |
Alternately the Imperative namespace may be imported. This isdiscouragedhowever. |
try {...}
|
try {...}
|
Nemerle's somewhat differenttry ... catchsyntax is consistent with its pattern matching syntax. |
(type) expr |
expr :> type |
Runtime type cast, allows for downcasts and upcasts. |
(type) expr |
expr : type |
Static cast, only upcasts are allowed. |
using System; |
using System; |
In Nemerle, you can apply the usingdirective to classes as well as namespaces. Opened namespaces allow you to drop the prefix of other namespaces, likeSystem inSystem.Xml. More info. |
using System.Windows.Forms; Button button = control as Button; if (button != null) |
match (control) {
|
as can be simulated withmatch. It is a bit more to type up in simple cases, but in general Nemerle's construct is more powerful. |
int y = x++; |
def y = x; |
The ++ and -- operators return void, just like assignment. So, both prefix and postfix versions are equivalent. |
Changes In Type Definitions
| C# | Nemerle | Remarks |
|---|---|---|
static int foo (int x, string y) |
static foo (x : int, y : string) : int |
Types are written after variable names. |
class Foo {
|
class Foo {
|
The constructor's name is alwaysthis. |
class Foo {
|
class Foo {
|
There is no special syntax for the destructor, you just override theFinalizemethod. |
class Foo : Bar {
|
class Foo : Bar {
|
The base constructor is called in the constructor's function body. |
class Foo {
|
class Foo {
|
Fields which will be changed outside of the constructor need to be marked asmutable. |
class Foo {
|
class Foo {
|
Read-only/const are used by default. |
class Foo {
|
class Foo {
|
Static variable. |
class Foo {
|
module Foo {
|
A module is a class in which all members are static. |
using System.Runtime.CompilerServices.CSharp;
class C {
|
class C {
|
Indexers. |
| C# | Nemerle |
|---|---|
| When two interfaces use the same method to perform different functions, different names can be given to each method. | |
interface SpeaksEnglish{
|
interface SpeaksEnglish{
|
Generics
| C# | Nemerle | Remarks |
|---|---|---|
class A { T x; }
|
class A [T] { x : T; }
|
Type parameters are written in square brackets [...]. |
typeof(A); |
typeof(A[_,_]); |
typeof expression |
New Stuff
Nemerle contains many constructs which are not present in C#. Unfortunately, most of them don't really fit into a side-by-side comparison format:
- Tuples -- a nameless, heterogeneous data structure.
- Lists -- a special syntax for lists and list processing.
- The Void Literal -- a useful construct for recursive functions.
- Local functions -- defining functions within other functions.
- Functional Values -- passing functions as arguments and returning them from other functions.
- Anonymous Functions -- defining functions which don't need names.
- Variants and Pattern Matching -- an alternative, and very useful, control flow construct.
- Macros -- writing code that writes code.
Other Minor Differences
Ambiguity Isn't Tolerated
namespace YourAttributes{
class Serializable : System.Attribute { }
}
namespace MyAttributes{
using YourAttributes;
class Serializable : System.Attribute { }
[Serializable] class SomeClass { }
}
C# compilers will choose MyAttributes.Serializable or, if its definition is commented out, YourAttributes.Serializable. Nemerle will raise an error telling you to be more specific about which attribute you want to use.
Exclusion of Overridden Methods
class BaseClass
{
public virtual AddItem (val : string) : void { }
} class TestClass : BaseClass
{
public AddItem (val : object) : void { }
public override AddItem (val : string) : void { }
}
...
TestClass().AddItem ("a"); // C# will choose TestClass.AddItem (object)
// Nemerle will choose TestClass.AddItem (string)
This behaviour comes from section 7.6.5.1 of the C# specification, which states "...methods in a base class are not candidates [for overload resolution] if any method in a derived class is applicable (§7.6.5.1)." Unfortunately, this rule is patently absurd in situations like the above. The Nemerle compiler always chooses the method whose signature best matches the given arguments.
CSharp Similarities and Differences的更多相关文章
- The Similarities and Differences Between C# and Java -- Part 1(译)
原文地址 目录 介绍(Introduction) 相似点(Similarities) 编译单位(Compiled Units) 命名空间(Namespaces) 顶层成员(类型)(Top Level ...
- Comparing the MSTest and Nunit Frameworks
I haven't seen much information online comparing the similarities and differences between the Nunit ...
- A Brief Review of Supervised Learning
There are a number of algorithms that are typically used for system identification, adaptive control ...
- TIJ——Chapter One:Introduction to Objects
///:~容我对这个系列美其名曰"读书笔记",其实shi在练习英文哈:-) Introduction to Objects Object-oriented programming( ...
- scala vs java 相同点和差异
本贴是我摘抄自国外网站,用作备忘,也作为分享! Similarities between Scala and Java Following are some of the major similari ...
- Gestures_Article_4_0
Technical Article Windows Phone 7™ Gestures Compared Lab version: 1.0.0 Last updated: August 25, 201 ...
- 15 things to talk about in a healthy relationship
15 things to talk about in a healthy relationship男女交往中可以谈论的15个话题 1. Your Daily Activities 1. 你的日常活动 ...
- .net程序员必须知道的知识
A while back, I posted a list of ASP.NET Interview Questions. Conventional wisdom was split, with ab ...
- SICP阅读笔记(一)
2015-08-25 008 Foreword QUOTE: I think that it's extraordinarily important that we in compute ...
随机推荐
- sql server 2012 自定义聚合函数(MAX_O3_8HOUR_ND) 计算最大的臭氧8小时滑动平均值
采用c#开发dll,并添加到sql server 中. 具体代码,可以用visual studio的向导生成模板. using System; using System.Collections; us ...
- JS和CSS的多浏览器兼容(1)
1.指定文件在IE浏览器中的兼容性模式 要为你的网页指定文件模式,需要在你的网页中使用meta元素放入X-UA-Compatible http-equiv 标头.以下是指定为Emulate IE7 m ...
- Hibernate,JPA注解@Entity
通过@Entity注解将一个类声明为一个实体bean(即一个持久化POJO类), @Id注解则声明了该实体bean的标识属性. 其他的映射定义是隐式的. 就是说一个持久化POJO类,除了主键ID需要@ ...
- 今天 同一个Nav 左右button 替换不显示的问题 viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序
viewWillAppear: Called when the view is about to made visible. Default does nothing视图即将可见时调用.默认情况下不 ...
- 9、Http回顾/Servlet
1 Http回顾 Http协议: 1)http协议: 对浏览器客户端和服务器端之间数据传输的格式规范. 2)http请求:浏览器->服务器端 格式: 请求行(请求方式(GET/POST) 请求资 ...
- js里的匿名函数 数组排序
// 匿名函数:其实就是函数的简写形式 var method =function(){ alert("123"); } method(); // 匿名函数可以用于事件的处理 fun ...
- html+css复习之第2篇 | javascript
1. java 中定义数组和对象: 数组(Array)字面量 定义一个数组: [40, 100, 1, 5, 25, 10] 对象(Object)字面量 定义一个对象: {firstName:&quo ...
- java 练习题
题目:想控制台输1-3个整数,按顺序为年,月,日.#号键结束输入.若输入一个整数,则为年份,程序判断是闰年还是平年:若输入两个整数,则为年份和月份,程序将输出该年的月份的天数:若输入3个整数:则为年, ...
- tomcat部署到根路径
在Tomcat中部署war包很简单: 首先,直接把相应的war包放到$TOMCAT_HOME/webapps下,不用建目录: 然后,修改$TOMCAT_HOME/conf/server.xml,在Ho ...
- hdu4933 Miaomiao's Function
水水的计数题,关键在细节. import java.math.BigInteger; import java.util.Scanner; import java.io.*; public class ...