Skip to main content
Redhat Developers  Logo
  • Products

    Featured

    • Red Hat Enterprise Linux
      Red Hat Enterprise Linux Icon
    • Red Hat OpenShift AI
      Red Hat OpenShift AI
    • Red Hat Enterprise Linux AI
      Linux icon inside of a brain
    • Image mode for Red Hat Enterprise Linux
      RHEL image mode
    • Red Hat OpenShift
      Openshift icon
    • Red Hat Ansible Automation Platform
      Ansible icon
    • Red Hat Developer Hub
      Developer Hub
    • View All Red Hat Products
    • Linux

      • Red Hat Enterprise Linux
      • Image mode for Red Hat Enterprise Linux
      • Red Hat Universal Base Images (UBI)
    • Java runtimes & frameworks

      • JBoss Enterprise Application Platform
      • Red Hat build of OpenJDK
    • Kubernetes

      • Red Hat OpenShift
      • Microsoft Azure Red Hat OpenShift
      • Red Hat OpenShift Virtualization
      • Red Hat OpenShift Lightspeed
    • Integration & App Connectivity

      • Red Hat Build of Apache Camel
      • Red Hat Service Interconnect
      • Red Hat Connectivity Link
    • AI/ML

      • Red Hat OpenShift AI
      • Red Hat Enterprise Linux AI
    • Automation

      • Red Hat Ansible Automation Platform
      • Red Hat Ansible Lightspeed
    • Developer tools

      • Red Hat Trusted Software Supply Chain
      • Podman Desktop
      • Red Hat OpenShift Dev Spaces
    • Developer Sandbox

      Developer Sandbox
      Try Red Hat products and technologies without setup or configuration fees for 30 days with this shared Openshift and Kubernetes cluster.
    • Try at no cost
  • Technologies

    Featured

    • AI/ML
      AI/ML Icon
    • Linux
      Linux Icon
    • Kubernetes
      Cloud icon
    • Automation
      Automation Icon showing arrows moving in a circle around a gear
    • View All Technologies
    • Programming Languages & Frameworks

      • Java
      • Python
      • JavaScript
    • System Design & Architecture

      • Red Hat architecture and design patterns
      • Microservices
      • Event-Driven Architecture
      • Databases
    • Developer Productivity

      • Developer productivity
      • Developer Tools
      • GitOps
    • Secure Development & Architectures

      • Security
      • Secure coding
    • Platform Engineering

      • DevOps
      • DevSecOps
      • Ansible automation for applications and services
    • Automated Data Processing

      • AI/ML
      • Data Science
      • Apache Kafka on Kubernetes
      • View All Technologies
    • Start exploring in the Developer Sandbox for free

      sandbox graphic
      Try Red Hat's products and technologies without setup or configuration.
    • Try at no cost
  • Learn

    Featured

    • Kubernetes & Cloud Native
      Openshift icon
    • Linux
      Rhel icon
    • Automation
      Ansible cloud icon
    • Java
      Java icon
    • AI/ML
      AI/ML Icon
    • View All Learning Resources

    E-Books

    • GitOps Cookbook
    • Podman in Action
    • Kubernetes Operators
    • The Path to GitOps
    • View All E-books

    Cheat Sheets

    • Linux Commands
    • Bash Commands
    • Git
    • systemd Commands
    • View All Cheat Sheets

    Documentation

    • API Catalog
    • Product Documentation
    • Legacy Documentation
    • Red Hat Learning

      Learning image
      Boost your technical skills to expert-level with the help of interactive lessons offered by various Red Hat Learning programs.
    • Explore Red Hat Learning
  • Developer Sandbox

    Developer Sandbox

    • Access Red Hat’s products and technologies without setup or configuration, and start developing quicker than ever before with our new, no-cost sandbox environments.
    • Explore Developer Sandbox

    Featured Developer Sandbox activities

    • Get started with your Developer Sandbox
    • OpenShift virtualization and application modernization using the Developer Sandbox
    • Explore all Developer Sandbox activities

    Ready to start developing apps?

    • Try at no cost
  • Blog
  • Events
  • Videos

From Java to .NET Core. Part 1

May 17, 2017
Yev Bronshteyn
Related topics:
.NETJava
Related products:
Red Hat OpenShift

Share:

    There was a time when the word ".NET" was virtually synonymous with bloat, vendor lock-in, and Windows. .NET Core is the exact opposite. It's blazingly fast. It's open source under a permissive license (Mostly MIT, some parts Apache-2.0). Unlike some other open-source platforms, .NET Core's Contributor License Agreement does not grant exclusive privileges to a single corporation. .NET Core is cross-platform, allowing you to target Windows, Mac, Docker, and many flavors of Linux. My favorite resource for getting started with .NET core is Don Schenck's free book. This post, I hope, can serve as an addendum specifically for Java developers exploring .NET's flagship language, C#. While C# borrows much from Java, there are important differences to be aware of. Fortunately, some of them are for the better. In this series of posts, I'll go over a few of the most prominent differences.

    1. Naming Conventions

    The naming and coding conventions are the surest way for experienced .NET developers to spot Java developers trying to cross over. In .NET, public methods are PascalCased, as in myObject.DoSomething();. Interface names always start with I, as in IComparable<T> (unless they were written by a Java developer). These are just the two most obvious differences. Before checking your code into a public repository, you may wish to check the full Coding Conventions and Naming Conventions.

    2. Properties instead of Getters and Setters

    In .NET, properties provide the same kind of encapsulation as get and set methods in Java classes, except properties are sweetened with a generous helping of syntactic sugar. Like this:

    public class Person
    {
       public string Name { get; set; }
    }
    
    public class MainClass
    {
        public static void Main(string[] args)
        {
            Person joe = new Person();
            joe.Name = "Joe";
            Console.WriteLine($"Why, hello, {joe.Name}!");
            Person joanna = new Person() { Name = "Joanna" };
        }
    }
    

    Want to make a property immutable? Easy!

    public class Person
    {
        public string Name{get; private set;}
    } 
    

    Want to implement your own get and set logic?

    public class Person
    {
        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                if ("Donald".Equals(value))
                {
                    Console.WriteLine("I'm moving to Canada!");
                }
                this.name = value;
            }
        }
    }
    

    3. Var instead of <> and carpal tunnel syndrome

    Remember the DRY rule ("don't repeat yourself")? Nothing is more repetitive than typing out a type name twice: once to declare and once to initialize:

    Dictionary<string, IList<string>> listMap = new Dictionary<string, IList<string>>();
    

    With Java's <> operator, the duplication would be reduced to just Dictionary, but in C#, we can do better:

    var listMap = new Dictionary<string, IList<string>>();
    

    The statement above is equivalent to the one immediately prior. The type of listMap becomes fixed. It cannot be assigned an object of any type other than Dictionary.

    Oh, and while we're on the subject, Dictionary is what we call maps in .NET (except they don't allow nulls).

    4. Linq instead of streams

    When streams were introduced in Java 8, many of the tasks previously requiring writing for loops became declarative and elegant. Here's how one might get an alphabetically sorted list of names:

    List<String> sortedNames = people.stream().map(Person::getName).sorted(String::compareToIgnoreCase).collect(Collectors.toList());
    

    C# developers have had similar functionality since 2008 in a feature called "Language Integrated Query" (LINQ). To use LINQ, first you'll need to add its namespace to your using declarations:

    using System.Linq;
    

    So here's the LINQ equivalent of that Java stream example above:

    IList<string> sortedNames = people.Select(person => person.Name).OrderBy(x => x.ToLower()).ToList();
    

    Ok, that's not much prettier. And, this approach does not look much like a query or very language-integrated. Fortunately, C# provides some nifty syntactic sugar to make the same functionality much easier to read and write:

    IEnumerable<string> names = from p in people
                                orderby p.Name.ToLower()
                                select p.Name;
    

    The same kind of query syntax can be applied to databases, XML, JSON, and just about anything else. It's completely extensible.

    To be continued...

    Obviously, there are many more differences than I have described here. In subsequent posts, we'll take up Assembly loading vs. class loading, true generics vs. type erasure, value types vs. primitives, and much more. While Java has been languishing in a design-by-committee quagmire, C# and .NET have been steadily advancing. Now that .NET Core, with its requisite compilers and language tooling are open source, you may be surprised by how productive and liberated you can become in this new and exciting ecosystem.

    For additional information and articles on .NET Core visit our .NET Core web page for more on this topic.

     


    Click here to install .NET Runtime for Red Hat Enterprise Linux and run a simple "Hello, World" application.

    Last updated: February 22, 2024

    Recent Posts

    • GuideLLM: Evaluate LLM deployments for real-world inference

    • Unleashing multimodal magic with RamaLama

    • Integrate Red Hat AI Inference Server & LangChain in agentic workflows

    • Streamline multi-cloud operations with Ansible and ServiceNow

    • Automate dynamic application security testing with RapiDAST

    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Products

    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform

    Build

    • Developer Sandbox
    • Developer Tools
    • Interactive Tutorials
    • API Catalog

    Quicklinks

    • Learning Resources
    • E-books
    • Cheat Sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site Status Dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Report a website issue