There are a number of areas in Salesforce Apex that can routinely catch a developer coming from a .NET language out. Worse still, when constantly switching between Apex and C# the similarities in syntax can lead to confusion about what is applicable in the current language.
This post will be a continual work in progress. I'll come back to it as things come up.
Feature | .NET C# | Salesforce Apex |
---|---|---|
String Delimiter | " - double quote | ' - single quote |
String Comparrison | Case sensitive by default. String.Equals can take a StringComparison.OrdinalIgnoreCase InvariantCultureIgnoreCase or to ignore case | Using == will be case insensitive. Use the String.equals or String.equalsIgnoreCase methods. |
For each loop syntax | foreach(X x in y) { } | for(X x : y) { } |
Case sensitivity | Case sensitive | Case insensitive. The variable map can easily conflict with the system type Map . |
Collections | List<string> or string[] are interchangeable in Apex. | |
Appending to the end of a list | The List<T>.add(index, T) method doesn't work if the list is empty. See Should List<Object>.add(index, listElement) work if the index is at the upper bound? | |
params | Apex doesn't have the concept of params like C# does. So if you try and pass a single string to something like String.format() you get the error Variable does not exist: String. Instead you need to explicitly put the formattingArguments into a List<string> or string[] |
|
Properties | Either automatic properties or explicit members required. |
Apex properties have an implicit member with the same name as the property.
Properties provide storage for values directly. You do not need to create supporting members for storing values.Read-only and write-only automatic properties |
Integers | int or System.Int32 |
integer |
Booleans | bool or Boolean | Boolean |
Nullable Types | Need to explicitly use Nullable<T> or ? notation to make primitive types nullable. | All variables are implicitly nullable. In addition to the usual suspects like Integer, Boolean, Decimal, Double, Long, String, Time, Date, DateTime, it also includes Boolean. So you may be passed a Boolean parameter that is neither true or false. |
Collections | Dictionary | Map |
Exceptions | Classes extending Exception must have a name ending in 'Exception'
Use this.setMessage(message); to set message rather that constructor. |
|
switch statement | switch | Not available, use multiple if/else if/else statements. Add "Switch" or "Case" Statement to Apex |
Generics | Yes | Internal Types only Winter 13 Release Notes Parameterized Interfaces No Longer Supported |
Access Modifiers | public "Public access is the most permissive access level. There are no restrictions on accessing public members" | global "This means the method or variable can be used by any Apex code that has access to the class, not just the Apex code in the same application."
public - "This means the method or variable can be used by any Apex in this application or namespace."
In Apex, the public access modifier is not the same as it is in Java. This was done to discourage joining applications, to keep the code for each application separate. In Apex, if you want to make something public like it is in Java, you need to use the global access modifier. |
See also:
- Keith Clarke - From Java to Apex
- From SQL to SOQL (for the .NET developer).
- Dreamforce 2015 Session - Apex Nuances: Transitioning to Force.com Development